在自己的使用块中处理对象不是多余的吗?

时间:2012-05-21 09:56:13

标签: c#

在对现有课程进行编程时,我注意到有人写过这样的内容:

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

    disp.Dispose()
}

然后我想知道:是不是使用块足以处理对象?可能有任何方式Dispose()在这种情况下有用吗?

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

5 个答案:

答案 0 :(得分:5)

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

using(.......)

此外,在disp disp.Dispose()之后有任何使用dispose对象的语句会产生错误,因为那时对象会被释放,即它的内存已被释放。

但要注意

如果usingdispose范围结束之前的最后一行,那么它就没用了。

但在{{1}}之后有更多行时,它并没有用。

答案 1 :(得分:2)

是的,使用块实际上等同于以下语言:

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

请注意,它最终使用的是“catch”之类的东西。即使存在异常,finally子句也将始终执行。

答案 2 :(得分:0)

using就足够了。没有理由两次致电Dispose

答案 3 :(得分:0)

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

  • 您希望在使用块结束之前处置该对象。在这种情况下,使用块是一个“安全网”,可确保即使发生异常也会处理您的对象。 (使用的行为就像一个try块,它有一个finally块,在其中放置你的对象)
  • 致电Dispose会让您更清楚自己在做什么。这是典型的,即

交易范围:

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

这次对Dispose的调用不是必要的,但它是“解释性的”。它使事务回滚更加成熟。

答案 4 :(得分:0)

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