我知道静态类变量在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;
}
}
}
有人可以用简单的英语为我解释一下吗?
答案 0 :(得分:5)
我在某处读过。
静态变量/字段在执行其包含类型的静态构造函数之前就已存在,并且在关联的应用程序域不再存在时不再存在。
答案 1 :(得分:1)
由于您在多线程ASP.NET应用程序的上下文中提出此问题,因此您应该非常小心。签出以下场景:
2个用户Bob和Alice在传递不同参数的同时调用getID
方法。 Bob传递Foo
并且Alice传递Bar
。由于这是第一次调用,_cachedID
变量尚未初始化,因此两者都进入if
条件,Bob略有延迟。因此,Alice将the _cachedID
静态变量设置为Bar
,将Bob
设置为Foo
之后的微秒。现在代码继续,函数为两个用户返回Foo
。鲍勃当然很高兴,因为那是他想要的,但爱丽丝想要Bar
。
例如,如果您想在多线程环境中执行一次初始化,可以考虑使用Singleton Pattern的线程安全版本。
这样做的道理是,在ASP.NET应用程序中处理共享/静态数据时应该非常小心。如果您需要使用它,您需要正确地同步对它的访问,否则可能会发生非常糟糕的事情。当您的应用程序被多个用户同时访问时,它们通常会在生产中发生。在您的本地PC上,一切都会正常工作。
回到关于静态字段生命周期的原始问题:它与应用程序域的生命周期联系在一起。
答案 2 :(得分:0)
您不能也不必创建对象的类,但您只能从静态上下文中访问它。
你会像这样使用你的例子:
MyFunctions.getID("bla");
http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx