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

时间:2011-07-06 16:50:16

标签: c# garbage-collection static-members

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

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

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

}

并且假设它是这样使用的:

//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();

abcd被垃圾回收时,静态成员shared也会被收集吗? e可能会获得shared的新实例吗?

2 个答案:

答案 0 :(得分:63)

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

请注意,要初始化的类不需要 HasStatic的任何实例,而shared变量必须引用{{1} }}

除非您正在考虑卸载AppDomains的情况,否则静态变量可以永远被视为GC根。 (当然,如果某些内容更改List<string>的值以引用其他实例,则第一个实例可能符合垃圾回收的条件。)

答案 1 :(得分:27)

我唯一要补充的是Jon的优秀答案是CLR 4支持“收藏品组装”。如果动态生成可收集的程序集,那么当程序集被垃圾收集时,其类型的静态就会消失。

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

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