繁体   English   中英

什么时候使用block调用dispose方法

[英]when does dispose method is called in using block

我试图通过输入断点来测试这段代码。 我想确保在使用块之后调用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();
    }
}

using块完成执行后,正常或异常(即通过异常)发生对Dispose of IDisposable的调用。

在源代码级调试器中捕获调用的唯一方法是,当您拥有IDisposable的源代码时 - 在您的情况下,它将是SqlCommand类的源代码。

检查其工作方式的一种简单方法是创建自己的IDisposable实现,将其放入using块,并观察其行为。 在完成using块之后,应立即调用Dispose

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。 您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果; 实际上,这就是编译器如何翻译using语句。 前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):

关键部分是“通过将对象放在try块中并最终调用来实现相同的结果”。

SqlCommand command = new SqlCommand(queryString, connection);
try {

      // your code here
} finally {

      command.Dispose();
}

来自MSDN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM