3

重複の可能性:
別のオブジェクトに渡されたときに、誰がIDisposableオブジェクトでDisposeを呼び出す必要がありますか?

次のようなインターフェイスを持つクラスがあるとします。

public interface Foo
{
    Load(IDisposable something);
}

このメソッドを実装するとき、完了したらdisposeを呼び出す必要がありますか?言い換えると、クラスのメソッドがStream、、Readerまたはその他の何かを受け取る場合IDisposable、このメソッドはストリームも破棄する必要がありますか、それともメソッドを呼び出した人に任せる必要がありますか?

私はどちらの方法でもうまくいくことを知っています、他の経験豊富な人が良い行動を考えるのは興味があります:-)

4

4 に答える 4

3

オブジェクトでより多くのことを行う可能性があるためDisposeLoadメソッドを呼び出さないでください。それ以上必要ない場合は、屋外で処分する必要があります。サンプルコード:IDisposableusing

using (var something = new Something())
{
    IFoo foo = new Foo();
    foo.Load(something);

    // Do more with something
}
于 2012-09-07T13:57:51.550 に答える
0

これは、インターフェースの文書化された動作によって異なります。

呼び出し元が「(再)使用」するためにストリームを開いたままにしておくことが理にかなっている場合は、文書化された状態(たとえば、そのようなブロックの後の現在の位置)でストリームを開いたままにしておくことができます。

それ以外の場合、最も役立つことは、ユーザーのためにそれを処分することであるように思われます。

CLRフレームワーククラスには、呼び出し元が何が発生するかを指定できるようにするための特殊なオーバーロードがある場合があることに注意してください。例を参照してください:http://msdn.microsoft.com/en-us/library/gg712952.aspx

public StreamReader(
    Stream stream,
    Encoding encoding,
    bool detectEncodingFromByteOrderMarks,
    int bufferSize,
    bool leaveOpen
)
于 2012-09-07T13:51:42.440 に答える
0

パラメータを追加して、呼び出し元がそれを破棄するかどうかを教えてくれるようにします(voidメソッドの戻り型にも追加しました)。

public interface Foo 
{ 
    void Load(IDisposable something, bool disposeSomething); 
} 
于 2012-09-07T13:54:51.557 に答える
0

オブジェクトにそれ自体が使い捨てである他のオブジェクトが含まれている場合、そのオブジェクトも使い捨てである必要があります。たとえば、排他的な読み取り/書き込み権限で開かれたファイルへの参照を保持するオブジェクトは、オブジェクトのクライアントができるように使い捨てである必要があります。基になるリソースがいつ閉じられるか、またはクリーンアップされるかを制御します。FooインターフェースをIDisposableから継承させる

于 2012-09-07T13:55:35.373 に答える