我正在学习 C#,我读到了一个名为 IDisposable 的接口,其中唯一的方法 Dispose() 使用 using 语法调用它。如果我使用以下内容:
Class b=new Class();
using(b)
{
//statements
}
using (Class o=new Class())
{
//statements
}
如果在这两种情况下大括号结束后我尝试使用对象 b 和 o 会发生什么?
我正在学习 C#,我读到了一个名为 IDisposable 的接口,其中唯一的方法 Dispose() 使用 using 语法调用它。如果我使用以下内容:
Class b=new Class();
using(b)
{
//statements
}
using (Class o=new Class())
{
//statements
}
如果在这两种情况下大括号结束后我尝试使用对象 b 和 o 会发生什么?
b
仍将在范围内而不是 null,但是如果您在调用后尝试使用它们,大多数实现良好的 dispose 类应该Dispose
抛出异常(从而阻止您进一步使用它)。
它将编译并且可能仍然可用——这完全取决于它是如何在内部实现的。但是,您不应该使用它,因为它的状态无法保证并且会创建令人困惑的代码。
o
将超出范围并且不会编译。
该using
语句所做的只是使编译器发出一些try-catch
语句并调用Dispose
包装的对象。它什么也不做。
如果您以后需要该对象,则不必使用 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 */
}
}