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ブラケットを返します。
角かっこを使用せずに変数を定義して返すことは、より良い方法ですか、それともリソースを節約しますか?
いいえ、この方法の方が明確だと思います。心配しないで、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);
}
}
これを見てください
CLRはコードをMSILに変換します。また、usingステートメントはtryと最終的にブロックに変換されます。これは、ILでusingステートメントを表す方法です。 usingステートメントは、取得、使用、廃棄の3つの部分に変換されます。リソースが最初に取得され、次に使用方法がfinally句を含むtryステートメントで囲まれます。その後、オブジェクトはfinally句で破棄されます。
using()
ステートメント内から戻るとnoの副作用があります。
最も読みやすいコードにするかどうかは別の議論です。
私は、それはすべて同じだと思います。コードに悪いところはありません。 .NETフレームワークは、オブジェクトの作成場所を気にしません。重要なのは、参照されるかどうかです。