什么是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的成员。