在C#代码中使用块有什么意义?

时间:2009-03-17 13:59:08

标签: c# using-statement

我看到大量带有以下语法的代码片段

using (RandomType variable = new RandomType(1,2,3))
{
   // A bunch of code here.

}

为什么不直接声明变量并使用它?

这种使用语法似乎只是使代码混乱并使其可读性降低。如果变量仅在该范围内可用,那么为什么不将该块放在函数中呢?

6 个答案:

答案 0 :(得分:11)

使用有一个非常明确的目的。

它设计用于实现IDisposable的类型。

在你的情况下,如果RandomType实现了IDisposable,它将在块的末尾得到.Dispose()'d。

答案 1 :(得分:9)

using (RandomType variable = new RandomType(1,2,3))
{
   // A bunch of code here.
}

几乎相同(有一些细微差别):

RandomType variable = new RandomType(1,2,3);

try
{
    // A bunch of code
}
finally
{
    if(variable != null)
        variable.Dispose()
}

请注意,在调用“使用”时,您可以将任何内容转换为IDisposable:

using(RandomType as IDisposable)

finally中的空检查将捕获任何实际上不实现IDisposable的内容。

答案 2 :(得分:4)

不,它不会使您的代码混乱,也不会降低其可读性。

using语句只能用于IDisposable类型(即实现IDisposable的类型)。

通过在using-block中使用该类型,当using-block的范围结束时,将使用该类型的Dispose方法。

所以,告诉我哪些代码对您来说不太可读:

using( SomeType t = new SomeType() )
{
   // do some stuff
}

SomeType t = new SomeType();

try
{
   // do some stuff
}
finally
{
   if( t != null ) 
   {
      t.Dispose();
   }
}

答案 3 :(得分:1)

在using语句中使用的对象必须实现IDisposable,因此在作用域的末尾,您可以保证将调用Dispose(),因此理论上,您的对象应该在此时释放。在某些情况下,我发现它使我的代码更清晰。

答案 4 :(得分:1)

using关键字提供了一种确定性方法来清理对象分配的托管或非托管资源。如果不使用using关键字,则在完成该对象时,您有责任调用Dispose()(或在某些情况下,Close())。否则,在下一次垃圾收集之前,可能无法清理资源,甚至根本不清除资源。

答案 5 :(得分:1)

根据MSDN,以下using代码:

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

扩展到:

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

它确实不会使你的代码混乱。事实恰恰相反!