2016-06-15 6 views
0

IDisposableを実装する要素を作成するときに、usingブロックの末尾にDispose()が呼び出されます。これが正しい場合は、例外がスローされた場合でも同様です。"using"はコンストラクタで作成されたオブジェクトも破棄しますか?

使い捨て要素のコンストラクタ内ClassBの新たな要素を作成する際IDisposableが実装されている場合は、はClassBののオブジェクトも配置されますか。

using (ClassA a = new ClassA(new ClassB())) 
{ 
} 

これはStreamに関連するクラスに適用される場合があります。 しかし、これは一般に適用されますか?

+4

号そのコンストラクタ内で作成されていませんが、**前**コンストラクタ。 – dymanoid

+1

もしそうなら、それはうんざりするでしょう。 IDisposableを実装し、この質問と同じくらい多くのキーストロークでテストするClassBを作成できます。 – Paparazzi

答えて

5

ClassBの場合の処理メソッドClassAが処理されます。

class ClassA : IDisposable 
{ 
    private ClassB b; 
    public ClassA (ClassB b) { this.b = b; } 
    public void Dispose() { this.b.Dispose(); } 
} 

それはあなたが個別に廃棄する必要がありますしない場合

using (ClassB b = new ClassB()) 
using (ClassA a = new ClassA(b)) 
{ 
} 
+1

最初のケースでも、 'ClassA'コンストラクタで例外が発生すると、' ClassB'インスタンスがリークします。 – Servy

+0

クラスを信頼できない方がいいです...クラスが逆コンパイル以外のコンストラクタパラメータも破棄しているかどうかを調べる方法はありますか?ストリームはそれを行うようです。しかし、一般的なパターンはありますか? – bytecode77

+0

@ bytecode77リソースを廃棄すると文書化されている場合は、そのリソースを廃棄すると仮定します。それが明示的に述べていない場合は、そうではないと仮定します。 – Servy

1

短い回答、いいえ。 ClassBIDisposableを実装している場合、あなたも使ってブロックでラップする必要があります

using (var b = new ClassB()) 
using (var a = new ClassA(b)) 
{ 
    // do stuff 
} 

すべてあなたがコンストラクタまたはメソッドである前を評価され、コンストラクタ、またはパラメータを受け取り、他のメソッドに渡すことに注意してください呼び出される。

StreamWriterのようなクラスの中には、コンストラクタで渡されたものはすべて破棄されますが、オブジェクトを実際にインスタンス化した人に処分を残すのが一般的です。

関連する問題