2

在对现有类进行编程时,我注意到有人写了这样的东西:

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

    disp.Dispose()
}

然后我想知道: using 块不足以处理一个对象吗?在这种情况下,Dispose() 有什么用处吗?

因为这对我来说没有任何意义...

4

5 回答 5

6

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

using(.......)

而且如果有任何语句使用dispobject之后disp.Dispose()它会报错,因为到那时object已经被释放,即它的内存已经被释放。

但要小心

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

但是当后面有更多的行时,它也不是没用的dispose

于 2012-05-21T09:57:03.767 回答
3

是的,一个 using 块实际上等同于以下的替代语法:

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

请注意,它使用 finally 而不是“catch”之类的东西。finally 子句将始终被执行,即使有异常。

于 2012-05-21T10:01:24.917 回答
0

using足够。没有理由打Dispose两次电话。

于 2012-05-21T09:58:14.000 回答
0

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

  • 您想在 using 块结束之前处理对象。在这种情况下, using 块是一个“安全网”,即使发生异常,也可以确保您的对象将被释放。(使用的行为就像一个 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它不是必需的,但它是“解释性的”。事务回滚更明显。

于 2012-05-21T10:09:18.557 回答
0

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

于 2012-05-22T02:35:11.613 回答