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
,b
和c
,以及d
垃圾收集时,静态成员是否也shared
被收集?可能e
会得到一个新的实例shared
?
Jon*_*eet 72
不,静态成员与Type相关联,Type与其加载的AppDomain相关联.
请注意,不必为该类初始化任何实例,HasStatic
并且该shared
变量具有对a的引用List<string>
.
除非您正在考虑卸载AppDomains的情况,否则静态变量可以永远被视为GC根.(当然,如果某些内容更改了HasStatic.shared
引用不同实例的值,则第一个实例可能有资格进行垃圾回收.)
Eri*_*ert 29
我唯一要补充的是Jon的优秀答案是CLR 4支持"收藏品组装".如果动态生成可收集的程序集,则在对程序集进行垃圾回收时,其类型的静态会消失.
有关该功能的简要概述,请参阅此msdn文章:
http://msdn.microsoft.com/en-us/library/dd554932%28VS.100%29.aspx