0

私のコードは以下のようになります。オブジェクトが破棄されているため、明らかに「OK」と書くことはできません。clone が存在しないため、 return sw.Clone() を実行できません。using を使用しない場合、 = new と return の間の任意の時点で (私の例では行わないオブジェクトへの反復と書き込みのように) 例外が発生し、オブジェクトが破棄されない可能性があります。

try ブロックの外側で sw を定義し、それが null かどうかを確認してから、catch ブロックで破棄する必要がありますか? ちょっとやり過ぎのような気がします。より良い方法はありますか?それが唯一の方法ですか?

    static void func1()
    {
        using (var sw = func2())
        {
            sw.WriteLine("Ok");
        }
    }
    static StringWriter func2()
    {
        using (var sw = new StringWriter())
        {
            return sw;
        }
    }
4

5 に答える 5

1

StringWriter を返すことを再検討することをお勧めします。追加の機能が必要な場所がいくつかあるかもしれませんが、リビングルームの真ん中に配管が突き出ているように感じます. これは公開 API の一部であってはならず、非公開の API でもちょっと扱いにくいです。

そうは言っても、必要な場合は、返す前に閉じたり破棄したりせず、using ブロックを使用しないでください。try/catch ブロックを使用します (つまり、finally 句ではなく、catch で Dispose します)。

于 2010-05-24T02:05:58.300 に答える
0

func1 および func2 メソッドを使用してクラスを作成し、IDisposable にして、コンストラクターで StringWriter を初期化し、クラスの Dispose メソッドでそれを Dispose します。

これは、複数のメソッドで StringWriter に書き込みを行っていることを前提としています。

于 2010-05-24T01:19:46.020 に答える
0

ブロックを使用して 2 番目を取り除きます。やるだけ

StringWriter sw = new StringWriter();
return sw;

using ブロックで定義している場合、StringWriter は破棄されます。

于 2010-05-24T01:21:16.910 に答える
0

参考: StringWriter の closeの実装は、真の値を渡す Dispose メソッドを呼び出します。呼び出し元のメソッドに 2 番目の sw を返して close を呼び出すと、同等の結果が得られます。

于 2010-05-24T01:26:31.157 に答える
0

IDisposableこれは、と に関する質問ではなく、を実装するオブジェクトを返すことに関する一般的な質問であると仮定しfunc1ますfunc2

実装するusing ものをブロックで囲みIDisposableます。

  1. それを作成し、
  2. メソッドが返されたときにもう必要ありません

あなたの場合、作成していますが、メソッドが戻った後も存在する必要があります。この場合、オブジェクトを作成するメソッドで using ブロックを使用しないでください。その後、オブジェクトを破棄するのは呼び出し元の責任になります。これは既に行われていることがわかります。

于 2010-05-24T01:52:03.950 に答える