c#中Using块的目的是什么?它和局部变量有什么不同?
Using
Using在__abc2 -块剩余后调用Dispose(),即使代码抛出异常。
Dispose()
所以你通常使用using来处理那些需要清理的类,比如IO。
using
所以,这个使用block:
using (MyClass mine = new MyClass()) { mine.Action(); }
会做同样的事情:
MyClass mine = new MyClass(); try { mine.Action(); } finally { if (mine != null) mine.Dispose(); }
使用using更简短,更容易阅读。
在using块中放置代码可以确保一旦控件离开块,对象就会被处理(尽管不一定会被收集)。
如果该类型实现了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();
从MSDN:
c#,通过.NET框架公共 语言运行库(CLR),自动执行 释放用于存储的内存 不再需要的对象。 释放的是记忆 不确定的;内存释放 当CLR决定执行时 垃圾收集。然而,它是 通常最好限量发行 例如文件句柄和 网络连接速度快如 可能的。< / p > using语句允许 程序员指定对象时 即使用的资源应该释放 他们。提供给使用者的对象 语句必须实现 IDisposable接口。这个接口 提供Dispose方法,该方法
c#,通过.NET框架公共 语言运行库(CLR),自动执行 释放用于存储的内存 不再需要的对象。 释放的是记忆 不确定的;内存释放 当CLR决定执行时 垃圾收集。然而,它是 通常最好限量发行 例如文件句柄和 网络连接速度快如 可能的。< / p >
using语句允许 程序员指定对象时 即使用的资源应该释放 他们。提供给使用者的对象 语句必须实现 IDisposable接口。这个接口 提供Dispose方法,该方法
换句话说,using语句告诉. net一旦不再需要using块中指定的对象,就释放它。
它实际上只是一些语法糖,不需要对实现IDisposable的成员显式调用Dispose。
using (B a = new B()) { DoSomethingWith(a); }
等于
B a = new B(); try { DoSomethingWith(a); } finally { ((IDisposable)a).Dispose(); }
using语句获取一个或多个资源,执行一条语句,然后处置资源。
using语句用于处理c#中实现IDisposable接口的对象。
IDisposable
IDisposable接口有一个名为Dispose的公共方法,用于处理对象。当我们使用using语句时,我们不需要在代码中显式地处理对象,using语句会处理它。
Dispose
using (SqlConnection conn = new SqlConnection()) { }
当我们使用上面的代码块时,内部生成的代码是这样的:
SqlConnection conn = new SqlConnection() try { } finally { // calls the dispose method of the conn object }
更多细节请阅读:理解c#中的using语句。
还要注意,通过using实例化的对象在using块中是只读的。参考c#官方参考在这里。