9

try catchステートメントを囲むusingブロックがある場合、catchが例外を発生させると、そのusingステートメント内のオブジェクトはどうなりますか?次のコードを検討してください。

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

Foo()が失敗し、例外が発生してプログラムが効果的に中断したと仮定した場合、databaseConnectivityObjectは破棄されますか?これが重要な理由は、オブジェクトにデータベース接続が関連付けられているためです。

4

5 に答える 5

12

usingtry-finallyの省略形と考えることができます。したがって、コードは次のようになります。

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

このように見るとDispose()、try-finallyはtry-catchの外にあるため、例外がスローされた場合に実際にが呼び出されることがわかります。

これがまさに私たちが使用する理由usingです。

于 2012-09-03T10:25:25.030 に答える
7

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

はい、そうなります。内部で使用するはtry-finally、を使用します(を実装するものに対してのみ機能しますIDisposable

MSDNから-usingステートメント

usingステートメントは、オブジェクトのメソッドの呼び出し中に例外が発生した場合でも、 Disposeが呼び出されるようにします。オブジェクトをtryブロック内に配置し、finallyブロックでDisposeを呼び出すことで、同じ結果を得ることができます。実際、これはusingステートメントがコンパイラーによって変換される方法です。

于 2012-09-03T10:22:20.697 に答える
3

はいusing、try --catchブロックがあるかどうかに関係なく、ブロックはdatabaseConnectivityObjectを破棄します。

当然のことながら、usingブロックは重要でIDisposableあり、例外が発生した場合でも適切に破棄されるように、実装するすべてのクラスで使用する必要があります。

MSDNから-usingステートメント

usingステートメントは、オブジェクトのメソッドの呼び出し中に例外が発生した場合でも、 Disposeが呼び出されるようにします。オブジェクトをtryブロック内に配置し、finallyブロックでDisposeを呼び出すことで、同じ結果を得ることができます。実際、これはusingステートメントがコンパイラーによって変換される方法です。

于 2012-09-03T10:23:51.910 に答える
3

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

foo()失敗しても処分されます。

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

また、これらの質問「C Sharpでの使用の使用」および「ステートメントの使用と最終的な試行」は、ステートメントの使用と実用性についてさらに詳しく説明していますusing

C#言語仕様のセクション8.13では、usingステートメントについて詳しく説明しています。

于 2012-09-03T10:24:01.730 に答える
2

あなたのusing コードはと同等です

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

主に3つの部分に分類されるusingステートメント

  1. 取得
  2. 使用法
  3. 廃棄

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

于 2012-09-03T10:26:49.160 に答える