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


当前回答

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

其他回答

在using块中放置代码可以确保一旦控件离开块,对象就会被处理(尽管不一定会被收集)。

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

在Using块离开后使用Dispose(),即使代码抛出异常。

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

所以,这个使用block:

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

会做同样的事情:

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

使用“使用”更简短,更容易阅读。

如果该类型实现了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();
using (B a = new B())
{
   DoSomethingWith(a);
}

等于

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