306

UsingC#中块的目的是什么?它与局部变量有何不同?

4

9 回答 9

365

如果该类型实现 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);
}

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


从 C# 8 开始,有一种新的语法using可以使代码更具可读性:

using var x = new SomeDisposableType();

它没有自己的{ }块,使用的范围是从声明点到声明它的块的末尾。这意味着您可以避免以下内容:

string x = null;
using(var someReader = ...)
{
  x = someReader.Read();
}

并有这个:

using var someReader = ...;
string x = someReader.Read();
于 2008-10-17T13:51:33.387 回答
121

UsingDispose()在 -block 离开后调用using,即使代码抛出异常。

因此,您通常using用于需要在它们之后进行清理的类,例如 IO。

所以,这个 using 块:

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

会做同样的事情:

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

使用using方式更短,更易于阅读。

于 2008-10-17T13:50:55.043 回答
51

来自 MSDN:

C# 通过 .NET Framework 公共语言运行时 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放是不确定的;每当 CLR 决定执行垃圾回收时,就会释放内存。但是,通常最好尽快释放文件句柄和网络连接等有限资源。

using 语句允许程序员指定使用资源的对象何时应该释放它们。提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。

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

于 2008-10-17T13:53:41.200 回答
29

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

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

using (SqlConnection conn = new SqlConnection())
{

}

当我们使用上面的块时,内部代码是这样生成的:

SqlConnection conn = new SqlConnection() 
try
{

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

有关更多详细信息,请阅读:了解 C# 中的“使用”语句

于 2012-01-13T00:01:38.670 回答
10
using (B a = new B())
{
   DoSomethingWith(a);
}

相当于

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}
于 2008-10-17T13:54:22.617 回答
9

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

于 2014-05-28T12:46:57.010 回答
5

将代码放在 using 块中可确保在控制离开该块时立即释放对象(尽管不一定要收集)。

于 2008-10-17T13:51:03.263 回答
2

它实际上只是一些语法糖,不需要您对实现 IDisposable 的成员显式调用 Dispose。

于 2008-10-17T13:53:44.490 回答
2

using 语句获取一个或多个资源,执行一个语句,然后释放该资源。

于 2009-10-05T06:45:47.433 回答