将类型转换为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) { ... }
- 使用TWAIN和BackgroundWorker进行TwainDotNet扫描
- 当我从’int’类型的sqlite列中选择时,我可以转换为.net int但是当我从’integer’列中选择时我不能
- 如何将listviewitem中的按钮绑定到Winrt中的ViewModel中的Command
- 绑定到资源键,WPF
- 存储XML中的自定义应用程序设置
- 如何在C#中的System.Windows.Forms.Button上放置unicode字符?
- 从VBA调用Rest API – “与服务器的连接exception终止”
- 可以通过批处理文件以编程方式删除和添加对csproj的引用吗?
- Visual Studio 2013代码覆盖率 – 未检测二进制文件