218

何かのようなもの:

using (IDisposable disposable = GetSomeDisposable())
{
    //.....
    //......
    return Stg();
}

returnステートメントの適切な場所ではないと思いますよね?

4

7 に答える 7

28

これは、途中で戻るのと同じように、完全に正常に機能しますtry{}finally{}

于 2009-03-19T15:55:30.827 に答える
19

それは完全に受け入れられます。usingステートメントは、IDisposable オブジェクトが何があっても確実に破棄されるようにします。

MSDNから:

using ステートメントを使用すると、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、Dispose が確実に呼び出されます。オブジェクトを try ブロック内に配置してから、finally ブロック内で Dispose を呼び出すことによって、同じ結果を得ることができます。実際、これは using ステートメントがコンパイラによってどのように変換されるかです。

于 2009-03-19T15:56:05.163 に答える
-4

おそらく、これが受け入れられるというのは 100% 真実ではないでしょう...

using をネストして、ネストされたものから戻ってきた場合、安全ではない可能性があります。

これを例にとります:

using (var memoryStream = new MemoryStream())
{
    using (var textwriter = new StreamWriter(memoryStream))
    {
        using (var csv = new CsvWriter(textwriter))
        {
            //..write some stuff to the stream using the CsvWriter
            return memoryStream.ToArray();
        }
    }
}

csvとして出力されるDataTableを渡していました。途中で戻り、すべての行をストリームに書き込んでいましたが、出力されたcsvには常に1行(またはバッファのサイズに応じて複数)がありませんでした。これは、何かが適切に閉じられていないことを示しています。

正しい方法は、以前のすべての使用が適切に破棄されていることを確認することです。

using (var memoryStream = new MemoryStream())
{
    using (var textwriter = new StreamWriter(memoryStream))
    {
        using (var csv = new CsvWriter(textwriter))
        {
            //..write some stuff to the stream using the CsvWriter
        }
    }

    return memoryStream.ToArray();
}
于 2016-09-23T20:37:50.697 に答える