在对现有类进行编程时,我注意到有人写了这样的东西:
using(DisposableObject disp = new DisposableObject())
{
...
...
disp.Dispose()
}
然后我想知道: using 块不足以处理一个对象吗?在这种情况下,Dispose() 有什么用处吗?
因为这对我来说没有任何意义...
在对现有类进行编程时,我注意到有人写了这样的东西:
using(DisposableObject disp = new DisposableObject())
{
...
...
disp.Dispose()
}
然后我想知道: using 块不足以处理一个对象吗?在这种情况下,Dispose() 有什么用处吗?
因为这对我来说没有任何意义...
dispose
在您的情况下,在内部使用是没用的,using
因为当using
语句的范围结束时,它会自动调用dispose
. 这就是为什么你只能在括号内编写实现IDisposable
接口的对象。using
using(.......)
而且如果有任何语句使用disp
object之后disp.Dispose()
它会报错,因为到那时object已经被释放,即它的内存已经被释放。
但要小心
如果是作用域结束dispose
之前的最后一行,那么它是无用的。using
但是当后面有更多的行时,它也不是没用的dispose
。
是的,一个 using 块实际上等同于以下的替代语法:
var d = new DisposableObject();
try
{
d.DoSomething();
}
finally
{
if(d != null)
((IDisposable)d).Dispose();
}
请注意,它使用 finally 而不是“catch”之类的东西。finally 子句将始终被执行,即使有异常。
using
足够。没有理由打Dispose
两次电话。
您可以在 using 块中使用 Dispose 有两个原因:
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 接口时,你应该确保它可以被多次调用。这意味着您应该进行一些验证。