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接口时,您应该确保它可以被多次调用。这意味着你应该做一些验证。我就是这么想的。。。我想我应该告诉这里的人