2016-08-29 5 views
1

私はこのコードをブレークポイントを入れてテストしようとしています。私はusingブロックの後にdisposeメソッドが呼び出され、リソース(SqlCommand)が正常に解放されていることを確認したい。 しかし、ブロックを使用していても、私は処分しました。ブロックを使用してdisposeメソッドが呼び出されたとき

using (SqlCommand command = new SqlCommand(queryString, connection)) 
{ 
    command.CommandType = CommandType.Text; 
    command.Parameters.Add("@OrganizationID", SqlDbType.Int); 
    command.Parameters["@OrganizationID"].Value = organizationId; 
    connection.Open(); 
    SqlDataReader sqlDataReader = command.ExecuteReader(CommandBehavior.CloseConnection); 

    try 
    { 
     while (sqlDataReader.Read()) 
     { 
      //do something 
     } 
    } 
    finally 
    { 
     sqlDataReader.Close(); 
    } 
} 
+1

から

SqlCommand command = new SqlCommand(queryString, connection); try { // your code here } finally { command.Dispose(); } 

あなたは詳細にこの部分を説明できますか? –

答えて

1

usingステートメントを使用すると、オブジェクトのメソッドを呼び出すときに例外が発生した場合でもDisposeが確実に呼び出されます。 tryブロックの中にオブジェクトを置き、finallyブロックでDisposeを呼び出すことで同じ結果を得ることができます。これは、usingステートメントがコンパイラによってどのように変換されるかです。コード例は、コンパイル時に次のコードに展開されます(オブジェクトの制限付きスコープを作成するために余分な中括弧に注意してください)。

重要な部分は、 "オブジェクトをtryブロックして最後に呼び出します "。私はどんなdispose`を打つ使用してブロックで `どこMSDN

5

usingブロックが正常または異常(すなわち、例外を介して)、実行を終了した後IDisposableDisposeへの呼び出しが起こります。

ソースレベルのデバッガでコールをキャッチする唯一の方法は、IDisposableのソースコードがある場合です。この場合、ソースコードはSqlCommandクラスになります。

この仕組みを確認する簡単な方法の1つは、usingブロックに独自のIDisposableを実装し、その動作を観察することです。ブロックusingの完了直後にDisposeへの呼び出しが続きます。

関連する問題