我最近一直在使用Using,但我想知道它与明确调用.Dispose()有什么不同。例如:
之间的区别using (DisposableTest obj = new DisposableTest()) { /* Some code */ }
和
DisposableTest obj = new DisposableTest();
// Some code
obj.Dispose();
假设DisposableTest实现IDisposable?
答案 0 :(得分:6)
带有using
关键字的第一个版本确保即使中间的代码抛出异常,也会处置obj
。这就像使用try
finally
块但不那么详细。
答案 1 :(得分:5)
他们在几个方面有所不同:
using
创建了一个新范围。
using
调用.Dispose()
,无论控制如何离开块(如果该对象在该点不为空)。这与编写try
/ finally
构造放置"如果不为null然后.Dispose()
"在finally
块中,但采用表达意图的格式。
它的存在使得如果控件以任何方式离开块(发生异常或遇到return
或break
),仍会调用.Dispose()
。它也更具表现力,因为它更好地表明了程序员对此案例的意图,而不是通用的try
/ finally
构造。
答案 2 :(得分:4)
来自MSDN:
using语句确保即使调用Dispose也会调用 在对象上调用方法时发生异常。您可以 通过将对象放在try块中来实现相同的结果 然后在finally块中调用Dispose;其实这是怎么回事 using语句由编译器翻译。
using (DisposableTest obj = new DisposableTest())
{
// some code throwing exception here.
}
相当于
{
DisposableTest obj = new DisposableTest();
try
{
// some code throwing exception here.
}
finally
{
obj.Dispose();
}
}
请注意额外的花括号以创建对象的有限范围
答案 3 :(得分:4)
您的代码完全没有区别。但是,如果块的主体非空,则会有显着差异:
using (DisposableTest obj = new DisposableTest()) {
<some code here> // This code may throw an exception
}
VS
DisposableTest obj = new DisposableTest();
<some code here> // Same code as above
obj.Dispose();
如果<some code here>
引发异常,using
阻止将执行obj.Dispose()
,而没有using
的代码将跳过obj.Dispose()
的呼叫。这就是为什么在确保清理至关重要的情况下,人们应该更喜欢using
。
答案 4 :(得分:1)
事实上,差异是不存在的。使用更加异常安全:如果发生,它不会跳过执行。顺便说一下,您可以使用的第三种结构是:
DisposableTest obj = null;
try
{
obj = new DisposableTest();
}
catch(Exception e)
{
}
finally
{
obj.Dispose();
}