asp.net/C#中的静态变量

时间:2011-04-04 09:26:21

标签: c# asp.net

我在我的Web应用程序项目中使用了大量的静态变量。现在我从一些文章中读到它是整个项目的全局变量,静态变量中的数据可以被其他用户共享或覆盖(我的意思是它不是用户特定的或特定于会话的)。

通常的编程习惯是不在常规Web应用程序开发中使用静态变量吗?

是否完全不使用静态变量,就像GOTO语句/关键字一样,意味着使用它们有很多限制,最好不要使用它们?那么在什么情况下我们使用静态关键字?

然后我要求特定变量必须在特定的webform.aspx.cs中初始化一次,并且范围必须仅限于特定的.aspx.cs和已记录的特定用户在?我如何满足这一要求?如果可能,任何人都可以用代码说明这一点吗?

5 个答案:

答案 0 :(得分:11)

我个人尽量避免使用静态变量。它们使代码难以进行单元测试,并且由于并发访问和竞争条件而导致细微错误。

就您的要求而言,您可以使用将变量存储为ViewState中控件的属性。如果它是您尝试存储的用户特定数据,则可以使用Session state

答案 1 :(得分:6)

我相信你对static的解释是错误的。

  

使用static修饰符声明一个   静态成员,属于   键入自己而不是特定的   对象

换句话说,该成员的所有特定实例只有一个该成员的实例。

只要正确使用静态变量,静态变量就没有任何问题。我相信你将静态与全局变量混合在一起。可以从任何地方访问全局变量。这是不可取的,因为知道设置该变量的状态的时间和地点是复杂的。此外,这使得单元测试更加困难。


Programmers.SE question可能让您感兴趣。

答案 2 :(得分:4)

关于静态,有各种原因可以解释为什么它们一般应该被避免,尽管它们确实有其特定的用途。

  

然后我要求特定变量必须在特定的webform.aspx.cs中初始化一次,并且范围必须仅限于特定的.aspx.cs和已记录的特定用户在?我如何满足这一要求?如果可能,任何人都可以用代码说明这一点吗?

对于这个要求,我建议你看看澄清要求:

就我个人而言,我更喜欢使用Session - 使用ViewState这样可以很容易地出错,当它们出错时,调试起来非常困难!


解释:“当它们出错时可能很难调试” - ViewState可以配置为多种方式工作,但通常它设置为通过将对象序列化为客户端页面作为隐藏表单字段然后再随后在页面PostBack发生时反序列化这些对象。我花了很多天时间调试某个基于DNN的网站,该网站仅在某些浏览器上出现“无效ViewState”问题,仅在某些页面上,而且仅在某些时间。是什么造成的?几天后我仍然不知道...因此,如果可以的话,为什么我要远离ViewState。但是,我承认这可能是一个不公平的决定 - 在我的情况下,我正在使用很多第三方代码生成动态页面并创建了很多ViewState(ViewState的大小和复杂性实际上是我的原因之一)如果可以的话,根本不使用WebForms。

答案 3 :(得分:1)

如何使用会话..

答案 4 :(得分:1)

例如,如果您有一些服务,那么您可以将其用作静态,因为不需要IIS为服务创建重复的对象,因为它们都是相同的:)