32990


WEB上で掲題の件について、多くの記事で議論されているのですが、以下の点だけ解決できなかったので、ご教示頂けますでしょうか。

`IDisposable`を実装したクラスの`Dispose`メソッドが呼ばれた後、当該クラスのインスタンス自体の参照はなくなるでしょうか。  
例えば、以下の様なコードです。

[code]

    private static sampleClass;
    
    static void Main() {
        sampleClass = new SampleClass();
        sampleClass.Dispose();
    }
    
    public class SampleClass : IDisposable {
        private StreamReader reader;
    
        public SampleClass() {
            reader = new StreamReader();
        }
    
        public void Dispose() {
            reader.Dispose();
        }
    }
    
[/code]

`sampleClass`
の参照はstatic変数に格納されてしまっている為、GC対象外になってしまうと思っています。`sampleClass`内の`reader`はGC対象の認識です。

認識に誤りがあるでしょうか。  
よろしくお願いします。


CC BY-SA 3.0
2017-02-28T08:40:38.570
32988
2017-02-28T09:01:03.013
15316
question
c# .net
C#におけるIDisposableインターフェース


`IDisposable.Dispose`自体は単なるメソッドですので、ガベージコレクションの参照追跡に関して特別な効果は持ちません。  
ただし、デストラクターを実装している`IDisposable`実装型は`IDisposable.Dispose`の呼び出し時に時に`GC.SuppressFinalize`を実行してインスタンスをファイナライゼーションキューから削除することが推奨されています。

また`static`フィールドや今後使用されるローカル変数から参照されているインスタンスはGCの対象になりません。ですので質問の`SampleClass.reader`は`Program.sampleClass`から参照されていますので対象外です。


CC BY-SA 3.0
2017-02-28T09:01:03.013
32990
2017-02-28T09:01:03.013
5750
32988
answer