关于ASP.NET中的静态变量问题?

龙宜坡 2008-12-27 10:13:13

关于ASP.NET中的静态变量问题?


我是用了“动软.NET代码生成器”生成的一系列简单三层架构代码(MODEL+DAL+BLL+WEB),我是要做一个小型企业网站,
我在Web层用到了大量静态变量,例如:网站的名称、域名、logo等等,在Web层中都封装到一个类的 静态属性 里去了,
我不知道这样做是否妥当!
请问,使用静态成员的坏处及静态成员在WebForm中和WinForm中有什么不同?谢谢了!
...全文
699 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙宜坡 2008-12-27
  • 打赏
  • 举报
回复
那么我这里的静态成员是在什么时候产生和什么时间灭亡的??


这个代码放在IIS上运行的话,静态成员是在第一个用户访问后一直存在还是??
龙宜坡 2008-12-27
  • 打赏
  • 举报
回复
@cuike519

受教了!
很是感谢!那么说我这样做是可行的,不过要小心使用了?
ppp7p 2008-12-27
  • 打赏
  • 举报
回复
使用静态类型应该还是要小心,在并发操作的时候可能会出现问题。
cuike519 2008-12-27
  • 打赏
  • 举报
回复
关于this我是举个例子,在实际的项目中我遇到过这种情况。

我所说的隐式含义是说:比如在一个页面实例方法中使用了这个静态变量,即使你没有写this,但是实际上这里有个this存在,这种情况可能会出现在事件绑定的时候。

声明为私有的确实不会被外部访问,我只是说明问题,提醒你在使用的时候要格外的注意,如果你的项目很小,这个问题并不凸显。

知道所以然你在使用的时候就会避免一些已知的问题。

根是不会被回收的,这是GC垃圾回收的起点,否则GC无法判断这个对象是不是垃圾,比如:栈上的对象也是根,寄存器里面的也是根。垃圾回收是不可预测的,必须要有一个规则来确定哪些是垃圾哪些不是垃圾。。。呵呵,扯得有点远了。。。
龙宜坡 2008-12-27
  • 打赏
  • 举报
回复
既然点将,就等他来!
MAOGE1987 2008-12-27
  • 打赏
  • 举报
回复
学习了。。。。。SP还没来么???
个人觉得不是所有东西都要封装在静态的啊
风骑士之怒 2008-12-27
  • 打赏
  • 举报
回复
学习
wuyq11 2008-12-27
  • 打赏
  • 举报
回复
静态成员存在于内存,静态成员不能访问非静态的成员.非静态成员可以直接访问类中静态的成

因为静态成员驻留内存,在方法与方法之间传递共享数据的时候,所以静态成员成了首选.但是在内存紧张或者用静态方法操作一些共享值的时候.或者要写多用户系统的时候,就有问题
曾默 2008-12-27
  • 打赏
  • 举报
回复
凑个热闹
龙宜坡 2008-12-27
  • 打赏
  • 举报
回复
@bhtfg538

感谢教诲!
bhtfg538 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 goga21cn 的帖子:]

关于ASP.NET中的静态变量问题?


我是用了“动软.NET代码生成器”生成的一系列简单三层架构代码(MODEL+DAL+BLL+WEB),我是要做一个小型企业网站,
我在Web层用到了大量静态变量,例如:网站的名称、域名、logo等等,在Web层中都封装到一个类的 静态属性 里去了,
我不知道这样做是否妥当!
请问,使用静态成员的坏处及静态成员在WebForm中和WinForm中有什么不同?谢谢了!
[/Quote]

汗 LZ 自己对基础知识 认识不深
静态变量的 认识 要从CLR开始 首先CLR会给默认的 类成员赋值 比如 int i; i默认=0
但是 静态变量 也是 在 第一个 实例出现之前赋值的,而且 只会赋值一次 .他不输入 实例成员
属于类成员 ,所以 可以直接 通过 类.变量 来访问 ,避免了其他语言中的 全局变量
静态变量的好处 就在于 他仍然 输入 类,作用域 还是在类中,一旦他的被引用的 成员全部没有引用了 就被CLR 回收了
这样的话 ,申明 static 比如网站名,对于 这些不要求 线程安全的 变量 直接 申请就好了
龙宜坡 2008-12-27
  • 打赏
  • 举报
回复
@cuike519

谢谢!

“一个静态变量隐式的引用了this” 这句不大明白!


private static IdealWebSite.BLL.Company _cm = new IdealWebSite.BLL.Company();
private static IdealWebSite.Model.Company _company = new IdealWebSite.Model.Company();
private static Regex _rx;



声明为private就是不让类外部引用!


che2piaopiao 2008-12-27
  • 打赏
  • 举报
回复
没用过, 帮顶
che2piaopiao 2008-12-27
  • 打赏
  • 举报
回复
这个类 应该放在MODEL层,其他层都要引用这个层,就可访问了,一般都这样做,这样就合理了。

claymore1114 2008-12-27
  • 打赏
  • 举报
回复
这个类 应该放在MODEL层,其他层都要引用这个层,就可访问了,一般都这样做,这样就合理了。
cuike519 2008-12-27
  • 打赏
  • 举报
回复
静态变量没什么不好,为什么会有讨论静态变量的根本原因是:静态变量的回收问题。静态变量是GC的根。按照GC的回收规则,根是不会被回收的。
静态变量最大的问题应该就是内存释放的问题,这个问题在大型的项目中尤为明显,而且一般情况下都是不被察觉的情况下被滥用。
比如:一个静态变量隐式的引用了this,这种情况下可能会导致this不会被释放,this可能是一个page也可能是一个其他对象,这将导致连锁反映,所有和this有引用关系的对象都会被Hold住,在垃圾回收的时候这些对象将不会被释放。
静态属性没有任何问题,静态方法也没有,这些属性和方法是在类型对应的方法表中。

但是静态变量也不是不能使用,只是使用的时候要格外的小心,其方便性不言而喻。

WebForm和WinForm里面静态变量的内存布局是一样的(都在托管堆上),所以他们没有本质的区别,只是应用的场景不同而已。

分析你的例子:

private static IdealWebSite.BLL.Company _cm = new IdealWebSite.BLL.Company();
private static IdealWebSite.Model.Company _company = new IdealWebSite.Model.Company();
private static Regex _rx;

这些将对象是根,不会被释放,如果你的程序中有引用这些对象的地方要格外小心。
龙宜坡 2008-12-27
  • 打赏
  • 举报
回复
我是这样认为的,但是不知道有什么弊端,比如在一个在管理后台改了数据,而另一个在前台访问了数据!
放在服务器端运行,怕有什么考虑不到的方面!
greatverve 2008-12-27
  • 打赏
  • 举报
回复
关注。
net_xiaojian 2008-12-27
  • 打赏
  • 举报
回复
简单一点讲

你希望每个人登入你网站上看的信息要是都一样的话就可以使用静态变量,反之不能用。
net_xiaojian 2008-12-27
  • 打赏
  • 举报
回复
用在你这里没问题。
加载更多回复(13)

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧