web-dev-qa-db-ja.com

静的メンバーはガベージコレクションされますか?

静的メンバー変数はガベージコレクションされますか?

たとえば、次のクラスを使用してみましょう。

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

abc、およびdがガベージコレクションされると、静的メンバーsharedも収集されますか? esharedの新しいインスタンスを取得する可能性はありますか?

45
C. Ross

いいえ、静的メンバーはTypeに関連付けられています。Typeは、読み込まれたAppDomainに関連付けられています。

クラスを初期化するためにanyHasStaticのインスタンスである必要はなく、shared変数はList<string>への参照を持つ必要があることに注意してください。

AppDomainがアンロードされる状況を考慮していない限り、静的変数は永久にGCルートと見なすことができます。 (もちろん、何かがHasStatic.sharedの値を変更して別のインスタンスを参照する場合、最初のインスタンスmayはガベージコレクションの対象になります。)

75
Jon Skeet

私がジョンの優れた答えに追加する唯一のものは、CLR 4が「収集可能なアセンブリ」をサポートすることです。収集可能なアセンブリを動的に生成する場合、アセンブリがガベージコレクションされると、そのタイプの静特性がなくなります。

機能の概要については、このmsdnの記事を参照してください。

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

30
Eric Lippert