ASP.NET中的静态C#类变量是什么?

时间:2012-07-02 06:33:33

标签: c# asp.net static static-members

我知道静态类变量在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;
        }
    }
}

有人可以用简单的英语为我解释一下吗?

3 个答案:

答案 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

相关问题