114

using以下の例では、ステートメント内に例外がスローされた場合、接続は閉じられて破棄されますか?

using (var conn = new SqlConnection("..."))
{
    conn.Open();
    // stuff happens here and exception is thrown...
}

以下のこのコードで確実に機能することはわかっていますが、usingステートメントでどのように機能するのか興味があります。

var conn;
try
{
    conn = new SqlConnection("...");
    conn.Open();
    // stuff happens here and exception is thrown...
}
// catch it or let it bubble up
finally
{
    conn.Dispose();
}

関連している:

例外がスローされたときにSQL接続が閉じられるようにする適切な方法は何ですか?

4

3 に答える 3

124

はい、usingコードをtry / finalブロックでラップします。このブロックでは、コードが存在する場合にそのfinally部分が呼び出さDispose()れます。ただし、実装されているインターフェイス、つまりメソッドClose()のみをチェックするため、直接呼び出すことはありません。IDisposableDispose()

参照:

于 2009-02-05T22:54:11.893 に答える
21

これは、リフレクターがコードによって生成されたILをデコードする方法です。

private static void Main(string [] args)
{{
    SqlConnection conn = new SqlConnection( "...");
    試す
    {{
        conn.Open();
        DoStuff();
    }
    ついに
    {{
        if(conn!= null)
        {{
            conn.Dispose();
        }
    }
}

したがって、答えは「はい」です。次の場合は接続が閉じられます。

DoStuff()
例外をスローします。

于 2009-02-05T22:58:23.710 に答える