126

次のように、DataContext を取得する using ステートメント内からメソッド値を返すと、常に正常に動作するようです。

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;
    }
}

しかし、using ステートメントの前にトランザクションを定義し、括弧内の値を取得し、括弧のに戻るなど、using ブラケットから抜け出す前に何かを閉じる必要があると常に感じています。

括弧を使用して変数を定義して返すことは、より良い方法であるか、何らかの方法でリソースを節約しますか?

4

5 に答える 5

165

いいえ、こちらの方がわかりやすいと思います。戻り値が完全に評価されたDisposeにのみ呼び出されます。任意の時点で例外がスローされた場合 (戻り値の評価を含む)も呼び出されます。Dispose

確かにもっと長い道のりをたどることもできますが、(精神的に)追跡するための余分なコンテキストと余分なコンテキストを追加するのは2つの余分な行です。実際、追加のローカル変数は実際には必要ありませんが、デバッグに関しては便利です。あなたただ持つことができます:

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);
    }
}
于 2010-03-03T09:07:39.263 に答える
32

これを見てください

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

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

于 2010-03-03T09:08:11.210 に答える
6

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

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

于 2010-03-03T09:08:27.547 に答える
0

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

于 2010-03-03T09:08:35.270 に答える
-1

はい、副作用の可能性があります。たとえば、ASP.NET MVC アクション メソッドで同じ手法を使用すると、次のエラーが発生します。

public ActionResult 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 PartialView("_transactionPartial", transaction);
    }
}
于 2014-12-11T19:33:04.670 に答える