私は以下を持っていれば、DisposeableObjectでIDisposeableが呼び出されますか、処理されない例外が発生したためにオブジェクトが開いたままになりますか?使用中の文でハンドルされていない例外が検出された場合、IDisposeableが呼び出されますか?
using (DisposeableObject = new Object())
{
throw new Exception("test");
}
私は以下を持っていれば、DisposeableObjectでIDisposeableが呼び出されますか、処理されない例外が発生したためにオブジェクトが開いたままになりますか?使用中の文でハンドルされていない例外が検出された場合、IDisposeableが呼び出されますか?
using (DisposeableObject = new Object())
{
throw new Exception("test");
}
MSDNによると、yesによると、コントロールがusing
ステートメントのスコープを離れるとき、ステートメントが破棄されることを期待してください。
例外が発生したときにスコープから外れるので、オブジェクトは破棄されます。
参照:using Statement (C# Reference)
usingステートメントは、廃棄を使用すると、オブジェクトのメソッドを呼び出している間に例外が発生した場合でも呼ばれていることを保証します。 tryブロックの中にオブジェクトを置き、finallyブロックでDisposeを呼び出すことで同じ結果を得ることができます。これは、usingステートメントがコンパイラによってどのように変換されるかです。
using
はtry...finally
でコードをラップし、最終的には、そう、はい、それは呼ばれるべきで廃棄するようなものです。
try..finallyブロックに展開すると、Disposeが呼び出されます。
Disposeを提供した例では、例外がスローされる前に呼び出されます。 usings文は、このような面倒なステートメントを記述する必要性を置き換える
var connection= new SqlConnection(connectionString);
try
{
// do something with the connection here
}
finally
{
connection.Dispose();
}
よう
その処分を確保するための通常のコードが呼び出されるが見えます。
using(var connection = new SqlConnection(connectionString))
{
// do something with the connection here
}
可能な複製http://stackoverflow.com/questions/1404769/when-would-dispose-method-not-get-called – SRM