using ブロック内のコードによってスローされた例外をキャッチする場合は、using ステートメント内で try{}catch(){} を使用することをお勧めします。次に、次の 2 つの例を考えてみましょう。これは、using ステートメント内の try-catch ブロックが優れた方法である理由を説明しています。
例 1
try{
using(SomeObject so = new SomeObject){
// Perform some tasks
}
}catch(SomeException objSomeException){
// Perform some actions, if exception occurs
}
例 2
using(SomeObject so = new SomeObject){
try{
// Perform some tasks
}catch(SomeException objSomeException){
// Perform some actions, if exception occurs
}
}
ここで、using ステートメント内でいくつかのタスクを実行中に例外が発生した場合、両方の例で同じ結果が得られます。簡単な答えはノーです。
例 1 で例外が発生すると、using ブロックの最後に到達することなく、catch ブロックによってキャッチされます。したがって、例 1 の someObject は適切に破棄されません。CLR が寛大であっても (これは当てにすべきではありません)、例 1 の someObject によって使用されたメモリは回復されません (または、第 2 世代の GC コレクションで最大になります)。
例 2 の場合、catch ブロックは using ステートメント内にあります。これは、実行が using ブロックの最後に到達することを意味します。したがって、オブジェクトは破棄され、メモリ リーク (破損、