在对现有课程进行编程时,我注意到有人写过这样的内容:
using(DisposableObject disp = new DisposableObject())
{
...
...
disp.Dispose()
}
然后我想知道:是不是使用块足以处理对象?可能有任何方式Dispose()在这种情况下有用吗?
因为它对我没有任何意义......
答案 0 :(得分:5)
在您的情况下,在dispose
内使用using
无效,因为当using
语句的范围结束时,它会自动调用dispose
。这就是为什么你只能在IDisposable
括号内编写实现using
接口的对象。
using(.......)
此外,在disp
disp.Dispose()
之后有任何使用dispose
对象的语句会产生错误,因为那时对象会被释放,即它的内存已被释放。
但要注意
如果using
是dispose
范围结束之前的最后一行,那么它就没用了。
但在{{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:
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接口时,你应该确保它可以被多次调用。这意味着你应该做一些验证。