使用块和try / catch的iDisposable对象

时间:2016-02-19 18:41:00

标签: c#

如果我写这样的代码:

try
{
    using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
    {

    }
}
catch(Exception e)
{

}

StreamReader对象抛出一个异常(从而进入catch),using块是否正确完成并处理?或者我是否需要在try中包装using块的内容?

想确保我得到适当的清理。

3 个答案:

答案 0 :(得分:0)

  
    

使用块是否正确完成并处理?

  

是。但是,如果GetResponseStream抛出异常,那么就没有什么可以处理的,因为你还没有初始化StreamReader

答案 1 :(得分:0)

是。一旦控件退出使用块,对象就会被释放。

答案 2 :(得分:0)

是肯定的。 using语句的解释类似于try ... finally

让我们看一个例子:

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):

例如:

Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
   if (font1 != null)
     ((IDisposable)font1).Dispose();
  }
}

要了解使用声明,请see this msdn article