.NET 公共静态变量的“寿命”?

Posted

技术标签:

【中文标题】.NET 公共静态变量的“寿命”?【英文标题】:"lifespan" of .NET public static variables? 【发布时间】:2011-07-12 19:29:36 【问题描述】:

我做了一个小实验。在来自 Login.aspx 按钮的 LoginButton_Click() 事件中,我有一个代码执行如下操作:

MyClass.MyPublicStaticString = LoginNameTextBox.Text;

登录后通过 FormsAuthentication 转到 Default.aspx。在 Default.aspx 上,我在 Page_Load() 上有这样的代码:

Label1.Text = MyClass.MyPublicStaticString.ToString();

等待几分钟后,即使我的登录超时到期之前,Label1.Text 也会变为空。

这里发生了什么?

【问题讨论】:

这并不能回答您的问题,但如果您使用的是表单身份验证并且需要用户名,为什么不直接从 User.Identity.Name 中提取它? (1) 您是否在其他任何地方设置了该值? (2) 小心显示用户名的公共静态字符串字段。它不是线程安全的,所以有人可能会得到错误的用户名。 【参考方案1】:

我从未使用过 ASP.NET,但我可以告诉你静态变量不会过期,或者类似的东西。

我最好的是,这与另一个请求以某种方式重置变量有关,或者甚至可能重新启动整个应用程序,创建一个全新的内存空间,显然没有以前的静态值。

【讨论】:

【参考方案2】:

我认为您的应用程序的 Page 类不再在您的网络服务器的内存中,这就是您的静态变量消失但您的身份验证 cookie 仍然有效的原因,因为您的 asp.net 表单身份验证超时可能尚未过期。

【讨论】:

【参考方案3】:

静态字段是(除非[ThreadStatic])每个应用程序域一个实例,这意味着:所有请求共享相同值。在 Web 应用程序中使用 static 时需要特别小心。如果有疑问:不要。

重新生命周期;应用程序域;它们在分配给静态字段时不会被收集,如果应用程序池在 IIS 中回收,它们将过期。

【讨论】:

【参考方案4】:

是否可以使用 ASP.NET Application State 对象代替,因为在 ASP.NET 中这也将跨多个回发/会话保持状态?

【讨论】:

【参考方案5】:

你真的应该使用 Session State 来处理这种事情。 如果您不这样做,那么在短时间内登录的两个用户都将获得最后一个用户的姓名,因为它最后存储在 MyPublicStaticString

【讨论】:

【参考方案6】:

可以使用应用程序状态对象。但是,它保存的信息将在应用程序运行期间持续存在。另一方面,会话状态具有与当前用户的访问相关的生命周期,以及此后 20 分钟的默认值,以验证他/她不只是临时吃零食和使用慢速网络。此外,ApplicationState 对所有用户上下文都是可见/可访问的;而 Session 仅在当前用户的上下文中可见和可访问。另一方面,回发在上下文中仅限于从服务器发送的最后一个页面的上下文,因为当浏览器将页面返回到服务器时会发生回发,包括用户操作的结果。 Page 的生命周期与 Session 的生命周期和 ApplicationState 的生命周期不同,不应混淆,任何一个都可以。

【讨论】:

以上是关于.NET 公共静态变量的“寿命”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 公共静态变量不需要实例化?

iOS中的公共静态变量

公共静态变量和Android活动生命周期管理

Objective-C 静态、外部、公共变量

私有静态变量

java基础(static---静态方法和静态变量以及静态方法)