静的メンバー変数はガベージコレクションされますか?
たとえば、次のクラスを使用してみましょう。
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
の新しいインスタンスを取得する可能性はありますか?
いいえ、静的メンバーはTypeに関連付けられています。Typeは、読み込まれたAppDomainに関連付けられています。
クラスを初期化するためにanyHasStatic
のインスタンスである必要はなく、shared
変数はList<string>
への参照を持つ必要があることに注意してください。
AppDomainがアンロードされる状況を考慮していない限り、静的変数は永久にGCルートと見なすことができます。 (もちろん、何かがHasStatic.shared
の値を変更して別のインスタンスを参照する場合、最初のインスタンスmayはガベージコレクションの対象になります。)
私がジョンの優れた答えに追加する唯一のものは、CLR 4が「収集可能なアセンブリ」をサポートすることです。収集可能なアセンブリを動的に生成する場合、アセンブリがガベージコレクションされると、そのタイプの静特性がなくなります。
機能の概要については、このmsdnの記事を参照してください。
http://msdn.Microsoft.com/en-us/library/dd554932%28VS.100%29.aspx