我试图通过输入断点来测试这段代码。我想确保在使用块之后调用dispose方法并且优雅地释放资源(SqlCommand)。 但是在使用区块中我没有任何处置?
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();
}
}
答案 0 :(得分:5)
Dispose
IDisposable
的调用发生在using
块完成执行后,正常或异常(即通过异常)。
在源级调试器中捕获调用的唯一方法是,当您拥有IDisposable
的源代码时 - 在您的情况下,它将是SqlCommand
类的源代码。 / p>
检查其工作方式的一种简单方法是创建自己的IDisposable
实现,将其放入using
块,并观察其行为。完成Dispose
阻止后,应立即调用using
。
答案 1 :(得分:3)
using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果;实际上,这就是编译器如何翻译using语句。前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):
关键部分是“通过将对象置于try块中并最终调用”来实现相同的结果。
SqlCommand command = new SqlCommand(queryString, connection);
try {
// your code here
} finally {
command.Dispose();
}
来自MSDN