在C#中使用和.Dispose()调用之间的区别

时间:2013-12-29 13:12:23

标签: c#

我最近一直在使用Using,但我想知道它与明确调用.Dispose()有什么不同。例如:

之间的区别
using (DisposableTest obj = new DisposableTest()) { /* Some code */ }

DisposableTest obj = new DisposableTest();
// Some code
obj.Dispose();

假设DisposableTest实现IDisposable?

5 个答案:

答案 0 :(得分:6)

带有using关键字的第一个版本确保即使中间的代码抛出异常,也会处置obj。这就像使用try finally块但不那么详细。

答案 1 :(得分:5)

他们在几个方面有所不同:

  1. using创建了一个新范围。

  2. using调用.Dispose(),无论控制如何离开块(如果该对象在该点不为空)。这与编写try / finally构造放置"如果不为null然后.Dispose()"在finally块中,但采用表达意图的格式。

  3. 它的存在使得如果控件以任何方式离开块(发生异常或遇到returnbreak),仍会调用.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();
}