Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“寿命”;NET公共静态变量的定义?_C#_Asp.net_Variables_Static_Public - Fatal编程技术网

C# &引用;“寿命”;NET公共静态变量的定义?

C# &引用;“寿命”;NET公共静态变量的定义?,c#,asp.net,variables,static,public,C#,Asp.net,Variables,Static,Public,我做了一个小实验。在Login.aspx按钮中的Login按钮单击()事件上,我有一个代码,类似于: MyClass.MyPublicStaticString = LoginNameTextBox.Text; 登录后,通过FormsAuthentication转到Default.aspx。在Default.aspx上,我在Page\u Load()上有一个如下代码: Label1.Text = MyClass.MyPublicStaticString.ToString(); 等待几分钟后,L

我做了一个小实验。在Login.aspx按钮中的Login按钮单击()事件上,我有一个代码,类似于:

MyClass.MyPublicStaticString = LoginNameTextBox.Text;
登录后,通过FormsAuthentication转到Default.aspx。在Default.aspx上,我在Page\u Load()上有一个如下代码:

Label1.Text = MyClass.MyPublicStaticString.ToString();
等待几分钟后,Label1.Text在我的登录超时到期之前变为空


这里发生了什么?

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


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

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

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


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

是否可以像在ASP.NET中那样使用ASP.NET对象?这也将在多个回发/会话中保持状态?

您真的应该用于此类事情。

如果不这样做,两个在短时间内登录的用户都将获得最后一个用户名
,因为它最后存储在
MyPublicStaticString

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

这并不能回答您的问题,但如果您使用的是表单身份验证,并且需要用户名,为什么不直接从
user.Identity.name
?(1)是否在其他地方设置该值?(2) 注意显示用户名的公共静态字符串字段。它不是线程安全的,因此有人可能会得到错误的用户名。