2

変数が IDisposable の場合using、廃棄を管理するためのキーワードがあります。しかし、メソッドで値を返す場合はどうすればよいusingでしょうか?

StringContent stringToStringContent(string str)
{
    using (StringContent content = new StringContent(str))
    {
        return content;
    }
}

void logStringContent()
{
    using (StringContent content = stringToStringContent("test"))
    {
        Debug.WriteLine(content.ToString());
        return;
    }
}

上記の例では、1 つしか持っていませんが、同じものに対してnew2 つ持っています。usingなのでバランスが悪い気がします。次のほうがよいですか。

a)両方usingを保持し、言語/コンパイラは二重の処分を避けるためにその仕事を知っていますか?

b) まとめて保管usingnew、それ以外の場合は必要ありませんか?:

void logStringContent()
{
    StringContent content = stringToStringContent("test");
    Debug.WriteLine(content.ToString());
    return;
}

c)using戻ってこないときだけ保管して、戻ってきたら必要ない?:

StringContent stringToStringContent(string str)
{
    return new StringContent(str);
}

私が感じることができる唯一のことは、b) が正しい答えではないということです。これは、ここで説明されているような問題では機能しないためです

4

2 に答える 2

0

オブジェクトを返すメソッドを持つことIDisposableは珍しいパターンではありませんが、例外が発生したときにリソース リークを防ぐことは困難な場合があります。別のアプローチは、新しいIDisposable受け入れoutor (メソッドが封印されていない仮想の場合)refパラメータを生成するメソッドを作成し、その中に新しいオブジェクトへの参照を格納することです。Dispose呼び出し元は、それを生成したメソッドが正常に返されたか、例外をスローしたかに関係なく、問題のものに期待されます。

それ以外の場合、メソッドの戻り値を newIDisposableにしたい場合、およびメソッドがリソースを取得してから返されるまでの間にコードが実行される場合は、次のようなコードでコードを保護する必要があります。

DisposableThing thingToDispose = null;
try
{
    thingToDispose = new DisposableThing(whatever);
    // Now do stuff that might throw.
    // Once you know you're going to return successfully...
    DisposableThing thingToReturn = thingToDispose;
    thingToDispose = null;
    return thingToReturn;
}
finally
{
    if (thingToDispose != null)
      thingToDispose.Dispose();
}

このコードは例外を「キャッチ」しませんが、関数が適切な指定されたパス以外を介して終了した場合、新しく構築されたオブジェクトは破棄されることに注意してください。新しく構築されたオブジェクトを破棄せずにこの関数が例外をスローすると、呼び出し元が破棄できないため、そのオブジェクトによって取得されたリソースがリークすることに注意してください。

于 2013-05-31T17:44:46.973 に答える