4

我正在学习 C#,我读到了一个名为 IDisposable 的接口,其中唯一的方法 Dispose() 使用 using 语法调用它。如果我使用以下内容:

Class b=new Class();
using(b)
{
//statements
}

using (Class o=new Class())
{
//statements
}

如果在这两种情况下大括号结束后我尝试使用对象 b 和 o 会发生什么?

4

2 回答 2

5

b仍将在范围内而不是 null,但是如果您在调用后尝试使用它们,大多数实现良好的 dispose 类应该Dispose抛出异常(从而阻止您进一步使用它)。

它将编译并且可能仍然可用——这完全取决于它是如何在内部实现的。但是,您不应该使用它,因为它的状态无法保证并且会创建令人困惑的代码。

o将超出范围并且不会编译。

using语句所做的只是使编译器发出一些try-catch语句并调用Dispose包装的对象。它什么也不做。

于 2013-07-03T13:21:53.027 回答
0

如果您以后需要该对象,则不必使用 using 块。建议使用它,但在某些情况下,您可以使用以下结构:

class b = null;
try
{
  b = new class();

  /* ... do your stuff ... */

}
catch (Exception)
{
  /* handle errors */  
  throw;
}
finally
{
  if (b != null)
  {
    b.Dispose();
    b = null;
  }            
}

如果存在,这种方式 b 将在您的方法结束时被处理。

您还可以在 using 块内有一个 using 块:

using (Class a=new Class())
{
  /* you can access a here */
  using (Class b=new Class())
  {
    /* you can access a and b here  */
  }
}
于 2013-07-03T13:37:28.307 回答