什么是C#使用块,为什么我应该使用它?
C#中Using块的用途是什么? 它与本地variables有什么不同?
如果types实现了IDisposable,它会自动处理它。
鉴于:
public class SomeDisposableType : IDisposable { ...implmentation details... }
这些是等价的:
SomeDisposableType t = new SomeDisposableType(); try { OperateOnType(t); } finally { t.Dispose(); }
using (SomeDisposableType u = new SomeDisposableType()) { OperateOnType(u); }
第二个更容易阅读和维护。
即使在代码抛出exception的情况下,在using
块保留之后Using
调用Dispose()
。
所以你通常使用需要清理的类,比如IO。
所以,这个使用块:
using (MyClass mine = new MyClass()) { mine.Action(); }
会做同样的事情:
MyClass mine = new MyClass(); try { mine.Action(); } finally { if (mine != null) mine.Dispose(); }
使用using
方法更短,更容易阅读。
来自MSDN:
C#通过.NET Framework公共语言运行库(CLR)自动释放用于存储不再需要的对象的内存。 记忆的释放是非确定性的; 每当CLR决定执行垃圾回收时,内存都会被释放。 但是,通常最好尽快释放有限的资源,例如文件句柄和networking连接。
using语句允许程序员指定何时使用资源的对象应该释放它们。 提供给using语句的对象必须实现IDisposable接口。 这个接口提供了Dispose方法,它应该释放对象的资源。
换句话说, using
语句告诉.NET一旦不再需要,就释放using
块中指定的对象。
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 }
有关更多详细信息,请参阅: 了解C#中的“using”语句 。
将代码放置在使用块中可确保只要控件离开块,对象就会处置(尽pipe不一定收集)。
另外请注意,通过using
实例化的对象在使用块内是只读的。 请参阅这里的官方C#参考。
using语句获取一个或多个资源,执行语句,然后处理该资源。
using (B a = new B()) { DoSomethingWith(a); }
相当于
B a = new B(); try { DoSomethingWith(a); } finally { ((IDisposable)a).Dispose(); }
这实际上只是一些syntically糖,不需要你明确地调用Dispose实现IDisposable的成员。