2012-09-03 2 views
8

try catchステートメントを囲むusingブロックを使用している場合、catchステートメント内のオブジェクトには何が起こりますか?我々はFooの()が失敗し、例外が発射されると効果的にプログラムが配置さdatabaseConnectivityObjectます破ると仮定した場合try catchでの文の使用。ステートメントを使用したインスタンスはどうなりますか?

using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse()) 
{ 
    try 
    { 
     Foo(); 
    } 
    catch (ArgumentNullException e) 
    { 
     throw; 
    } 
} 

:次のコードを考えてみましょうか?これが重要な理由は、オブジェクトにはデータベース接続が関連付けられているためです。

答えて

9

usingはtry-finallyの短縮形と考えることができます。したがって、あなたのコードは同等です:この方法を見

IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse(); 
try 
{ 
    try 
    { 
     Foo(); 
    } 
    catch(ArgumentNullException e) 
    { 
     throw; 
    } 
} 
finally 
{ 
    if(databaseConnectivityObject != null)//this test is often optimised away 
    databaseConnectivityObject.Dispose() 
} 

、あなたは例外がスローされた場合のtry-最終的にはのtry-catchの外にあるので、Dispose()は確かに、呼び出されることがわかります。

これは、正確に私たちがusingを使用している理由です。

+0

ありがとうジョン。コード例は非常に明確です。 – CSharpened

7

Foo()が失敗し、例外が発生し、実質的に がプログラムを中断してdatabaseConnectivityObjectが破棄されると仮定しますか?

はいです。内部try-finally(のみIDisposableを実装しているもののために働くを使用して)を使用しています

を使用すると、使用してステートメントが廃棄は、あなたがメソッドを呼び出している間 例外が発生した場合でもと呼ばれていることを保証MSDN- using statement

からオブジェクト上に はtryブロック内にオブジェクトを入れ、finallyブロックで を呼び出して同じ結果を得ることができます。実際には、これは usingステートメントがコンパイラによってどのように翻訳されるかです。

+0

したがって、 usingブロック内のすべてのコードを試し、私たちが見ることのできないfinallyブロックのMyObject.Dispose()を呼び出します。 – CSharpened

+1

@CSは、まったく正しいですね。あなたは答えのリンクの詳細な例を見ることができます – Habib

3

はい、あなたのusingブロックは、try-catchブロックを持っているかどうかにかかわらず、databaseConnectivityObjectを破棄します。

あなたは間違いなく使用ブロックは重要であり、例外が発生した場合でも正しく処分されるように、IDisposableを実装するすべてのクラスに使用する必要があります。

MSDN- using statement

から、usingステートメントを使用すると、オブジェクトのメソッドを呼び出している間 例外が発生した場合でも処分をと呼ばれていることを保証します。 はtryブロック内にオブジェクトを入れ、finallyブロックで を呼び出して同じ結果を得ることができます。実際には、これは usingステートメントがコンパイラによってどのように翻訳されるかです。

3

usingブロックを実装する場合、括弧内のオブジェクトは、IDisposableインターフェイスを実装する場合は削除されます。

foo()が故障しても依然として処分されます。

usingステートメント内のオブジェクトは、IDisposableインターフェイスを実装する必要があります。

また、これらの質問"Uses of using in c sharp""using statement vs try finally"は、usingステートメントの用途と実用性についてさらに詳しく述べています。

C# Language Specificationのセクション8.13は使用法を明確に詳述しています。

2

あなたusingコードが

IDatabaseConnectivityObject databaseConnectivityObject = new IDatabaseConnectivityObject(); 
try 
{ 
//To do code here 
} 
finally 
{ 
    if(databaseConnectivityObject!=null) 
    { 
     databaseConnectivityObject.Dispose(); 
    } 
} 

主に3つの部分に分け使用ステートメントすなわち

  1. に相当する取得
  2. 使用
  3. 廃棄

まず、リソースを取得し、最終的にtry文を使用してtryブロックを使用します。最後に、上記のコードで指定されているように、最後にオブジェクトがfinallyブロックに配置されます。

+1

ヌルテストは、説明できるときには一般的に最適化されていることを指摘する価値があると思います。誰かがミクロ最適化として自分自身でtry-finallyをやって誘惑されるかもしれません。とにかく(読みやすさの低下はそれに値するものではありませんが)それは悪い考えですが、それが考えている小さな利益を提供しさえしないという事実も、それをさらに抑えるでしょう。 –

関連する問題