当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 22:11:04 C#

铸造类型分享给IDisposable-为什么?看到这个。为什么显式转换为IDisposable?这只是确保在退出using块时调用IDisposable的简写吗?using(proxyasIDisposable){strings=proxy.Stuff()}这个“技巧”,如果你可以调用它,很可能是因为代理是一种编译器无法验证的类型是否实际实现了IDisposable。using指令的好处是,如果它的参数为null,则在退出using语句的范围时不会调用Dispose。所以你展示的代码实际上很简单:vardisposable=proxyasIDisposable;尝试{strings=proxy.Stuff();}finally{if(disposable!=null)disposable.Dispose();}换句话说,它说“如果这个对象实现了IDisposable,那么我需要在完成下面的代码时处理它。”这是不必要的,因为根据MSDN文档,using语句显式绑定到IDisposable接口以提供方便的语法,确保正确使用IDisposable对象。编辑:C#语言规范(第8.13节)为using语句的语法糖提供了三种可能的扩展:形式为using(ResourceTyperesource=expression)语句的using语句对应于三种可能的扩展之一。当ResourceType是不可为null的值类型时,展开为{ResourceTyperesource=expression;尝试{声明;}最后{((IDisposable)resource).Dispose();}}否则,当ResourceType为可空值类型或dynamic以外的引用类型时,展开为{ResourceTyperesource=expression;尝试{声明;}finally{if(resource!=null)((IDisposable)resource).Dispose();}}否则,当ResourceType为动态时,扩展为{ResourceTyperesource=expression;IDisposabled=(IDisposable)资源;尝试{声明;}finally{if(d!=null)d.Dispose();请注意,在这些扩展中的每一个中,无论如何,转换都是作为IDisposable完成的,所以正如最初所说的那样,因为不需要IDisposable。如果您从某处获得了一个代理实例并且其静态类型未实现IDisposable但您知道实际类型可能会实现并且您希望确保它将被处置,则可能需要执行此操作将类型强制转换为IDisposable-为什么?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——publicclassProxy:ISomeInterface,IDisposable{...}privateISomeInterfaceCreate(){...}ISomeInterfaceproxy=Create();//没有`as`就无法编译using(proxyasIDisposable){...}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: