静态成员变量是否会被垃圾收集?
例如,让我们使用以下类。
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();
当a
,b
,c
和d
被垃圾回收时,静态成员shared
也会被收集吗? e
可能会获得shared
的新实例吗?
答案 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