实例类的静态成员

8

实例类的静态成员只在实例本身存在期间存在,还是静态成员将在整个应用程序生命周期内存在?

例如,假设我有一个哈希表作为静态属性。如果我从一个“实例”添加项目,它们是否可以从另一个“实例”中访问?

1个回答

17

它们在AppDomain的整个生命周期中存在。(对于Windows应用程序,这通常是进程的生命周期;但具体取决于你正在做什么。在ASP.NET中,AppDomains会定期回收。)

不要认为静态变量是在实例之间共享的 - 而是属于类型而不是任何特定实例。这使得当你有时候永远不创建任何实例时更容易理解事情的工作原理。

例如:

class Test
{
    static int x = 0;

    static void Main()
    {
        x = 10;
        Console.WriteLine(x);
    }
}

周围没有实例可以“共享”Test.x——但这没关系,因为它与类型Test相关联,而不是与Test的实例相关联。

你可以认为这是一个非常微妙的区别,但我发现这个区别很有用。


我倾向于将其视为“与类型相关并在所有实例之间共享”。 - Joel Coehoorn
2
@Joel:但这是否仍然会给出一个虚假的感觉,即实例与此有任何关系?你同样可以确切地认为 Test.x 在所有 "string" 实例之间都是共享的 :) - Jon Skeet
5
我倾向于认为静态成员与实例无关,除了类型名称和访问修饰符处理外,因此在这个问题上我支持Jon而不是Joel的观点。 - Jeff Yates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接