C# Isn';在它自己的使用块中处理对象难道不是多余的吗?

C# Isn';在它自己的使用块中处理对象难道不是多余的吗?,c#,C#,在对现有类进行编程时,我注意到有人编写了如下内容: using(DisposableObject disp = new DisposableObject()) { ... ... disp.Dispose() } 然后我想知道:使用块是否足以处理对象?在这种情况下,是否有任何方法可以使用Dispose() 因为它对我没有任何意义…在您的情况下,在中使用dispose是无用的,因为当使用语句的作用域结束时,它会自动调用dispose。这就是为什么您只能在中使用括号编写实

在对现有类进行编程时,我注意到有人编写了如下内容:

using(DisposableObject disp = new DisposableObject())
{
    ...
    ...

    disp.Dispose()
}
然后我想知道:使用块是否足以处理对象?在这种情况下,是否有任何方法可以使用Dispose()


因为它对我没有任何意义…

在您的情况下,在
中使用
dispose
是无用的,因为当
使用
语句的作用域结束时,它会自动调用
dispose
。这就是为什么您只能在
中使用
括号编写实现
IDisposable
接口的对象

using(.......)
此外,如果在
disp.Dispose()
之后有任何语句使用
disp
对象,它将给出一个错误,因为到那时对象将被释放,即其内存已被释放

但要小心

如果
dispose
using
作用域结束之前的最后一行,则它是无用的


但是,当
dispose
之后有更多行时,使用
就足够了。没有理由调用两次
Dispose

是的,using块实际上等同于以下内容,并且是以下内容的替代语法:

var d = new DisposableObject();
try
{
    d.DoSomething();
}
finally
{
    if(d != null)
         ((IDisposable)d).Dispose();
}

注意,它使用finally而不是catch之类的东西。即使出现异常,finally子句也将始终执行。

可以在using块内使用Dispose的原因有两个:

  • 要在使用块结束之前处置对象。在这种情况下,using块是一个“安全网”,它确保即使发生异常,对象也会被释放。(使用的行为类似于try块,try块有一个最终块,在该块中放置对象)
  • 调用
    Dispose
    可以更清楚地了解您在做什么。这是典型的,即
事务范围:

using(TransactionScope ts=new TransactionScope)
{
  ...
  if (cond)
  {
    ts.Complete();
  }
  else
  {
    ts.Dispose(); // makes it clear you're rolling back the transaction
  }
}

Dispose
的调用不是必需的,但它是“解释性的”。交易被回滚更为明显。

@Nikhil Agrawal是对的。我需要提到的一件事是,当您实现Idisposable接口时,您应该确保它可以被多次调用。这意味着你应该做一些验证。

我就是这么想的。。。我想我应该告诉这里的人