web-dev-qa-db-ja.com

using()ステートメント内から戻ることによる副作用はありますか?

insideからメソッド値を返すDataContextを取得するusingステートメントは、常に機能するようですfine

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        var transaction = (from t in db.Transactions
                              orderby t.WhenCreated descending
                              where t.Id == singleId
                              select t).SingleOrDefault();
        return transaction;
    }
}

しかし、使用中の括弧から抜け出す前に何かを閉じるにすべきだといつも感じています。トランザクションを定義することでbefore usingステートメント、その値を取得insideブラケット、そしてafterブラケットを返します。

角かっこを使用せずに変数を定義して返すことは、より良い方法ですか、それともリソースを節約しますか?

119
Edward Tanguay

いいえ、この方法の方が明確だと思います。心配しないで、Disposeは「途中で」呼び出されます-そして、afterのみが戻り値が完全に評価されます。例外がスローされた場合(戻り値の評価を含む)、Disposeも呼び出されます。

確かにcouldより長いルートを取りますが、それは2つの余分な行であり、(精神的に)追跡するために残骸と余分なコンテキストを追加するだけです。実際、追加のローカル変数は実際には必要ありませんが、デバッグの点では便利です。 couldただ持っている:

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        return (from t in db.Transactions
                orderby t.WhenCreated descending
                where t.Id == singleId
                select t).SingleOrDefault();
    }
}

実際、ドット表記を使用して、Where内にSingleOrDefault条件を入れたいと思うことさえあります。

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        return db.Transactions.OrderByDescending(t => t.WhenCreated)
                              .SingleOrDefault(t => t.Id == singleId);
    }
}
157
Jon Skeet

これを見てください

C#の「using」ステートメントを理解する

CLRはコードをMSILに変換します。また、usingステートメントはtryと最終的にブロックに変換されます。これは、ILでusingステートメントを表す方法です。 usingステートメントは、取得、使用、廃棄の3つの部分に変換されます。リソースが最初に取得され、次に使用方法がfinally句を含むtryステートメントで囲まれます。その後、オブジェクトはfinally句で破棄されます。

30
Adriaan Stander

using()ステートメント内から戻るとnoの副作用があります。

最も読みやすいコードにするかどうかは別の議論です。

6
Mitch Wheat

私は、それはすべて同じだと思います。コードに悪いところはありません。 .NETフレームワークは、オブジェクトの作成場所を気にしません。重要なのは、参照されるかどうかです。

0
Kerido