静态成员是否会收集垃圾?

C. *_*oss 44 c# garbage-collection static-members

静态成员变量是否会被垃圾收集?

例如,让我们使用以下类.

public class HasStatic {
    private static List<string> shared = new List<string>();

}
Run Code Online (Sandbox Code Playgroud)

并且假设它像这样使用:

//Startup
{
HasStatic a = new HasStatic();
HasStatic b = new HasStatic();
HasStatic c = new HasStatic();
HasStatic d = new HasStatic();
//Something
}
//Other code
//Things deep GC somewhere in here
HasStatic e = new HasStatic();
Run Code Online (Sandbox Code Playgroud)

a,bc,以及d垃圾收集时,静态成员是否也shared被收集?可能e会得到一个新的实例shared

Jon*_*eet 72

不,静态成员与Type相关联,Type与其加载的AppDomain相关联.

请注意,不必为该类初始化任何实例,HasStatic并且该shared变量具有对a的引用List<string>.

除非您正在考虑卸载AppDomains的情况,否则静态变量可以永远被视为GC根.(当然,如果某些内容更改了HasStatic.shared引用不同实例的值,则第一个实例可能有资格进行垃圾回收.)

  • +1.我对此非常肯定,但需要进行测试以验证....甚至可以在我的*C#深度*书中查找它!大声笑 (3认同)
  • 应该提到两个例外.通过`WeakReference`引用的任何东西都可以被垃圾收集,因为任何静态成员被实例化为其线程终止的`ThreadLocal`. (3认同)

Eri*_*ert 29

我唯一要补充的是Jon的优秀答案是CLR 4支持"收藏品组装".如果动态生成可收集的程序集,则在对程序集进行垃圾回收时,其类型的静态会消失.

有关该功能的简要概述,请参阅此msdn文章:

http://msdn.microsoft.com/en-us/library/dd554932%28VS.100%29.aspx

  • 哇...以前从未听说过这些.总是很高兴学到新东西. (5认同)