将类型转换为IDisposable – 为什么?

看到这个。 为什么显式转换为IDisposable? 这只是确保在退出使用块时调用IDisposable的简写吗?

using (proxy as IDisposable) { string s = proxy.Stuff() } 

这个“技巧”,如果你可以调用它,很可能是由于proxy是一种类型,编译器无法validation真正实现IDisposable

using指令的好处是,如果它的参数为null ,那么在退出using语句的范围时不会调用Dispose

所以你展示的代码实际上是简单的:

 var disposable = proxy as IDisposable; try { string s = proxy.Stuff(); } finally { if (disposable != null) disposable.Dispose(); } 

换句话说,它说“如果这个对象实现了IDisposable,那么当我完成下面的代码时,我需要处理它。”

这是不必要的,因为根据MSDN文档 , using语句显式绑定到IDisposable接口

提供方便的语法,确保正确使用IDisposable对象。

编辑 : C#语言规范 (第8.13节)为using语句的语法糖提供了三种可能的扩展:

表格的使用声明

 using (ResourceType resource = expression) statement 

对应于三种可能的扩展之一。 当ResourceType是不可为空的值类型时,扩展为

 { ResourceType resource = expression; try { statement; } finally { ((IDisposable)resource).Dispose(); } } 

否则,当ResourceType是可空值类型或动态以外的引用类型时,扩展为

 { ResourceType resource = expression; try { statement; } finally { if (resource != null) ((IDisposable)resource).Dispose(); } } 

否则,当ResourceType是动态的时,扩展是

 { ResourceType resource = expression; IDisposable d = (IDisposable)resource; try { statement; } finally { if (d != null) d.Dispose(); } } 

请注意,在这些扩展中的每一个中,无论如何as IDisposable完成转换,因此如最初所述,不需要as IDisposable

如果你从某个地方给你一个proxy实例并且它的静态类型没有实现IDisposable但是你知道真正的类型可能会这样做并且你想确保它将被处理,这可能是必需的

 public class Proxy : ISomeInterface, IDisposable { ... } private ISomeInterface Create() { ... } ISomeInterface proxy = Create(); //won't compile without `as` using(proxy as IDisposable) { ... }