c#中Using块的目的是什么?它和局部变量有什么不同?


当前回答

还要注意,通过using实例化的对象在using块中是只读的。请参考这里的官方c#参考。

其他回答

如果该类型实现了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 var x = new SomeDisposableType();

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

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

还有这个:

using var someReader = ...;
string x = someReader.Read();

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

还要注意,通过using实例化的对象在using块中是只读的。请参考这里的官方c#参考。

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

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#中的“using”语句。