私が次のものを持っているとしましょう:
using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
なぜ次のことをして、中括弧をいくつか失ってはいけないのですか?:
var ctx = DataContextFactory.Create(0);
ctx.Dispose();
アドバイスありがとうございます!
私が次のものを持っているとしましょう:
using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
なぜ次のことをして、中括弧をいくつか失ってはいけないのですか?:
var ctx = DataContextFactory.Create(0);
ctx.Dispose();
アドバイスありがとうございます!
最初の方が良いです。例外がスローされた場合でも破棄されることを保証し、null を返すケースを正しく処理します (つまり、null インスタンスCreate(0)
を呼び出そうとしません)。Dispose()
using
声明は常に優れています...
Dispose()
コードがさまざまなコード パスに進化したとしても、を呼び出すことを忘れないでください。Dispose()
例外があっても呼び出されます。また、 をnull
呼び出す前にチェックDispose()
しますnew
。自明ではない (とにかく私には) トリックの 1 つusing
は、複数の使い捨てオブジェクトがある場合に過度のネストを回避する方法です。
using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
input.copyTo(output);
}
VS コード フォーマッタは、同じ列で始まる 2 つのステートメントを残します。
実際、状況によっては、using ステートメントを繰り返す必要さえありません...
using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))
ただし、同じ行で複数の変数を宣言するための制限がここに適用されるため、型は同じでなければならず、暗黙の型varを使用することはできません。
可能な場合は、using
マークが引用している理由で使用してください。OTOHこれは脳死の解決策ではありません。オブジェクトの存続期間を字句スコープとして定義できない場合があるため、合理的に使用してください。
usingブロックを使用したくない唯一の場所は、使い捨てオブジェクトが関数の外部でスコープされている場所です。この場合、クラスはIDisposableを実装し、Dispose()でオブジェクトを破棄する必要があります。
usingステートメントは、優れた構文と例外保護を提供します。Disposeを呼び出さずにusingステートメントを残すことはできません(disposeを呼び出すとfinallyブロックに変換されます)。2番目のシナリオでは、作成と破棄の間に例外があった場合、直接破棄を呼び出すことはありません。管理されていないリソースを使用している場合を除いて、これは問題ではありませんが、使用している場合はリークします。