3

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

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

4

3 回答 3

5

我在某处读过。

静态变量/字段在执行其包含类型的静态构造函数之前就存在,并且在关联的应用程序域不再存在时不再存在。

于 2012-07-02T06:37:08.513 回答
1

由于您是在多线程 ASP.NET 应用程序的上下文中提出这个问题的,因此您应该非常小心。检查以下场景:

2 个用户 Bob 和 AlicegetID在完全相同的时间调用该方法并传递不同的参数。Bob 通过Foo,Alice 通过Bar。由于这是第一次调用,_cachedID变量尚未初始化,因此两者都进入if条件,Bob 稍有延迟。所以 Alice 将the _cachedID静态变量设置为Bar,并在一微秒后将Bob其设置为Foo。现在代码继续,函数Foo为两个用户返回。鲍勃当然很高兴,因为那是他想要的,但爱丽丝想要Bar

例如,如果您想在多线程环境中执行一次性初始化,您可以考虑使用单例模式的线程安全版本。

这样做的寓意是,在 ASP.NET 应用程序中处理共享/静态数据时应该非常小心。如果您需要使用它,您需要正确同步对它的访问,否则可能会发生非常糟糕的事情。当您的应用程序被多个用户同时访问时,它们通常发生在生产环境中。在您的本地 PC 上,一切都会正常工作。

回到您关于静态字段生命周期的原始问题:它与应用程序域的生命周期相关。

于 2012-07-02T06:49:01.000 回答
0

您不能也不必创建对象的类,但您只能从静态上下文中访问它。

你会像这样使用你的例子:

MyFunctions.getID("bla");

http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

于 2012-07-02T06:39:20.950 回答