什么是C#Using块,我为什么要使用它?

时间:2008-10-17 13:49:21

标签: c# .net syntax using using-statement

C#中使用块的目的是什么?它与局部变量有什么不同?

9 个答案:

答案 0 :(得分:286)

如果类型实现了IDisposable,它会自动处理它。

假设:

public class SomeDisposableType : IDisposable
{
   ...implmentation details...
}

这些是等价的:

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
    if (t != null) {
        ((IDisposable)t).Dispose();
    }
}

using (SomeDisposableType u = new SomeDisposableType()) {
    OperateOnType(u);
}

第二种更容易阅读和维护。

答案 1 :(得分:96)

Using - 块之后,

Dispose()调用using,即使代码抛出异常。

因此,您通常会将using用于需要清理的类,例如IO。

所以,这个使用块:

using (MyClass mine = new MyClass())
{
  mine.Action();
}

会做同样的事情:

MyClass mine = new MyClass();
try
{
  mine.Action();
}
finally
{
  if (mine != null)
    mine.Dispose();
}

使用using更短更容易阅读。

答案 2 :(得分:39)

来自MSDN:

  

C#,通过.NET Framework常见   语言运行时(CLR),自动   释放用于存储的内存   不再需要的对象。   内存的释放是   非确定性;内存被释放   每当CLR决定执行时   垃圾收集。但是,确实如此   通常最好释放有限   文件句柄和文件等资源   网络连接速度快   可能。

     

using语句允许   程序员指定何时对象   使用资源应该发布   他们。提供给使用的对象   声明必须执行   IDisposable接口。这个界面   提供Dispose方法,其中   应释放对象的资源。

换句话说,using语句告诉.NET在不再需要时释放using块中指定的对象。

答案 3 :(得分:22)

using语句用于处理实现IDisposable接口的C#中的对象。

IDisposable接口有一个名为Dispose的公共方法,用于处理对象。当我们使用using语句时,我们不需要在代码中显式地处理对象,using语句会处理它。

using (SqlConnection conn = new SqlConnection())
{

}

当我们使用上面的块时,内部代码生成如下:

SqlConnection conn = new SqlConnection() 
try
{

}
finally
{
    // calls the dispose method of the conn object
}

有关详情,请阅读:Understanding the 'using' statement in C#

答案 4 :(得分:5)

将代码放置在使用块中可确保在控件离开块时尽快处理对象(但不一定要收集)。

答案 5 :(得分:5)

using (B a = new B())
{
   DoSomethingWith(a);
}

相当于

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}

答案 6 :(得分:5)

另请注意,通过using实例化的对象在using块中是只读的。请参阅官方C#参考here

答案 7 :(得分:2)

实际上只是一些语法糖不要求你在实现IDisposable的成员上显式调用Dispose。

答案 8 :(得分:2)

using语句获取一个或多个资源,执行语句,然后处置资源。