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

C# 在C代码中使用块有什么意义?,c#,using-statement,C#,Using Statement,我看到大量使用以下语法的代码片段 using (RandomType variable = new RandomType(1,2,3)) { // A bunch of code here. } 为什么不声明变量并使用它呢 这种使用语法的方式似乎只会使代码变得杂乱无章,使其可读性降低。如果这个变量只在这个范围内可用,那么为什么不把它放在一个函数中呢 using (RandomType variable = new RandomType(1,2,3)) { // A bunch o

我看到大量使用以下语法的代码片段

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

}
为什么不声明变量并使用它呢

这种使用语法的方式似乎只会使代码变得杂乱无章,使其可读性降低。如果这个变量只在这个范围内可用,那么为什么不把它放在一个函数中呢

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()
}
请注意,调用Using时,可以将任何内容强制转换为IDisposable:

using(RandomType as IDisposable)

finally中的null检查将捕获实际上没有实现IDisposable的任何内容。

使用具有非常明确的目的

它设计用于实现IDisposable的类型


在您的情况下,如果RandomType实现IDisposable,它将在块的末尾得到.Dispose。

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

不,它不会使您的代码变得混乱,或者降低可读性

using语句只能用于IDisposable类型,即实现IDisposable的类型

通过在using-block中使用该类型,当using块的作用域结束时,将使用该类型的Dispose方法

那么,请告诉我哪些代码可读性较差:

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


using关键字提供了一种确定性方法来清理对象分配的托管或非托管资源。如果不使用using关键字,则负责调用Dispose,或者在某些情况下,在处理完该对象后关闭。否则,在下一次垃圾回收之前,可能不会清理资源,甚至根本不会清理资源。

根据,使用以下代码:

扩展到:

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

而且它确实不会使您的代码变得混乱。事实恰恰相反

如果它没有实现IDisposable,我认为它实际上不会编译。事实上,会发生编译错误。但是,您可以在使用中将任何内容转换为IDisposable。。。某些类型为IDisposable。如果SomeType未实现IDisposable,则传入null且从不释放,这是安全的。但如果以null传入,using块中的代码很可能会因NullReferenceException而崩溃,不是吗?@Svish:否。它会在编译器生成的finally块中执行null检查。这是使用的一个优点。不完全是:“using”还将名称varialbe限制在using块的范围内,因此您可以在同一范围内的另一个声明中重复使用该名称。但要点就在这里。添加的正确答案与MSDN中的答案基本相同。@Joel您是对的,但这是由C编译器强制执行的。在IL中,RandomType对象在try块外部创建@实际上,finally块中的检查是if变量!=无效的如果RandomType未实现IDisposable,C编译器将不允许您使用。在代码块周围添加{}也会限定该段代码的作用域,如果对象不是一次性的,则无需使用。@Sekhat:我不是建议您在变量不可IDisposable时使用来限定其作用域。我想你误解了我的意思。我只是在解释使用提供的功能的一个子部分。此外,可能有一些代码,您不知道它是否实现了IDisposable。如果它实现了IDisposable,那么用using包装它是一种安全的方法,可以让它得到处置,但您当时无法知道。这种情况经常发生在泛型方法和扩展方法中。Dup of和它只有在不知道它的作用时才显得无用。在using关键字上点击F1是否真的太多了?实际上,这两种方法都增加了混乱-只是目前没有比使用更好的选项。太多的使用块或try.。最后,块会导致代码缩进地狱,并且还会对对象的创建或处理位置设置限制,例如,不能交错使用块。
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();
  }
}