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

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

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

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

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

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

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

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

使用static修饰符声明一个静态成员,该成员属于该类型本身而不是特定对象。

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

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


这个Programmers.SE问题可能对你很感兴趣。

在静态上,尽管它们具有特定的用途,但是为什么它们应该在一般情况下被避免有各种原因。

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

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

  • 是每个用户一次? 如果是这样,那么请查看使用ASP提供的Session对象。 Session示例代码是http://msdn.microsoft.com/en-us/library/ms972429.aspx
  • 或每个用户每页一次? 即如果同一用户在同一页面上打开了两个浏览器,那么用户是否会有两个对象? 如果是这样,那么请查看页面中的ViewState 。 ViewState的概述是http://msdn.microsoft.com/en-us/library/ms972976.aspx

我个人更喜欢使用Session – 使用ViewState它很容易出错,当它们出错时,调试起来非常困难!


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

怎么样使用会话..

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