ASP.NET中静态C#类变量的用途是什么? 我知道C++类中的静态类变量是什么,我不太清楚的是,在ASP.NET Web应用程序中的C类中,静态类变量的生命周期。下面是一个代码示例: namespace MyWebApp { public static class MyFunctions { private static string _cachedID; public static string getID(string strValue) { if(_cachedID == null) _cachedID = strValue; return _cachedID; } } }
有人能用简单的英语给我解释一下吗?我在什么地方读过ASP.NET中静态C#类变量的用途是什么? 我知道C++类中的静态类变量是什么,我不太清楚的是,在ASP.NET Web应用程序中的C类中,静态类变量的生命周期。下面是一个代码示例: namespace MyWebApp { public static class MyFunctions { private static string _cachedID; public static string getID(string strValue) { if(_cachedID == null) _cachedID = strValue; return _cachedID; } } },c#,asp.net,static,static-members,C#,Asp.net,Static,Static Members,有人能用简单的英语给我解释一下吗?我在什么地方读过 静态变量/字段在执行其包含类型的静态构造函数之前存在,并且在关联的应用程序域停止存在时停止存在。不能且不必创建对象的类,但只能从静态上下文访问它 您可以这样使用您的示例: MyFunctions.getID("bla"); 既然您是在多线程ASP.NET应用程序的上下文中提出这个问题,那么您应该非常小心。签出以下场景: 2个用户Bob和Alice同时调用getID方法并传递不同的参数。鲍勃通过Foo,爱丽丝通过Bar。由于这是第一次调用,\u
静态变量/字段在执行其包含类型的静态构造函数之前存在,并且在关联的应用程序域停止存在时停止存在。不能且不必创建对象的类,但只能从静态上下文访问它 您可以这样使用您的示例:
MyFunctions.getID("bla");
既然您是在多线程ASP.NET应用程序的上下文中提出这个问题,那么您应该非常小心。签出以下场景: 2个用户Bob和Alice同时调用
getID
方法并传递不同的参数。鲍勃通过Foo
,爱丽丝通过Bar
。由于这是第一次调用,\u cachedID
变量尚未初始化,因此两者都会进入if
条件,并稍微延迟。因此Alice将_cachedID静态变量设置为Bar
,一微秒后,Bob
将其设置为Foo
。现在代码继续,函数为两个用户返回Foo
。鲍勃当然很高兴,因为那正是他想要的,但爱丽丝想要的是Bar
例如,如果您希望在多线程环境中执行一次初始化,您可以考虑使用.< /p>的线程安全版本。
这一点的寓意是,在ASP.NET应用程序中处理共享/静态数据时,应该非常小心。如果您需要使用它,您需要正确地同步对它的访问,否则可能会发生非常糟糕的事情。当应用程序被多个用户并发访问时,它们通常发生在生产环境中。在您的本地PC上,一切正常
回到您最初关于静态字段生存期的问题:它与应用程序域的生存期有关。谢谢。比如说,如果我的web应用发布在www.mydomain.com的URL上,并且第一个用户通过web浏览器登录到它。将设置cachedID变量。但是,如果另一台计算机的完全不同的用户登录到同一URL,则cachedID将已设置为第一个值。这就是你说的吗?@ahmd0,是的。整个AppDomain只有一个静态成员实例。@AlexeiLevenkov,singleton模式之间存在差异(在AppDomain的生存期内,只有一个实例可能分配给静态字段)和一个静态字段,在AppDomain的生存期内,您可以在其中分配任意多的实例。@DarinDimitrov,hmmm。。。我不确定人们会如何表达这样一个事实:静态字段精确地分配了个,并在整个AppDomain中共享。我的尝试是“静态成员的实例”,正如我现在所看到的,它可以被解读为对单例模式的引用。
静态字段精确地分配了一个,并在整个AppDomain中共享。
->这样很完美。没有更多的混乱。谢谢你的链接。我不清楚的是ASP.NET环境中这些静态变量的生命周期?谢谢,达林。这解释得很好。我会记住这一点。还有一个问题——当我们谈论访问我的web应用程序的web浏览器时,IIS服务器如何记住该变量?IIS什么都不记得。ASP.NET应用程序在其中执行的应用程序域将其存储在内存中。