将使用null工作吗?
如果资源没有实现IDisposable,以下代码是否可行?
T resource = new T(); using (resource as IDisposable) { ... }
是的,它会工作,检查这个运行测试:
[TestMethod] public void TestMethod8() { using (new MyClass() as IDisposable) { } } public class MyClass { }
它运行没有任何问题。 如果相应的类实现了IDisposable,它将调用它,如果不是它仍将工作/运行:)。
更新:正如其他人所说,我也想知道你想给它带来什么用途。 我的猜测是你有类似工厂的东西可以从不同的类中获取实例,这可能是也可能不是一次性的:)。
是。 using
语句检查它是否被赋予null
并避免尝试调用Dispose
如果是这样)。
从C#3规范的8.13节:
使用声明分为三个部分:获取,使用和处置。 资源的使用隐式包含在包含finally子句的try语句中。 这个finally子句处理资源。 如果获取了空资源,则不会调用Dispose,也不会抛出exception。
它应该工作正常,即使不是处理资源的“正确”方法。 using
语句只是语法糖
IDisposable o = ...; try { // ... } finally { if (o != null) o.Dispose(true); }
因此,如果o从未实现IDisposable
,它将在using
语句中为null,并且它将尝试在其上调用Dispose
。
在测试代码时,似乎不会导致任何编译或运行时错误。
从语言定义(见8.13节): –
如果获取了空资源,则不会调用Dispose,也不会抛出exception。
如果类型不能转换为IDisposible,则as运算符会将资源转换为null,并且封装在using块中的代码将执行完全正常,行为与未将其包含在using块中的行为完全相同。
简而言之,你的问题的答案是肯定的。
如果“它会工作”你的意思是你会得到一个运行时错误吗? 不,你不会。
有什么用? 有什么好处? 有什么好处?
using语句将确保调用Dispose方法,但如果您的对象没有实现IDisposable,我认为没有使用这样做? 它会工作(因为,它不会抛出运行时exception,它会编译),我刚刚在这里测试,但…
使用您写下的代码,您甚至无法将资源用作IDisposable ……
当类型显式实现IDisposable时,它可能很有用,在这种情况下,Dispose方法不能直接在类型上访问,除非类型被转换为IDisposable,使用’as’进行安全转换并确保调用Dispose。 在大多数情况下,当类型显式实现IDisposable时,它提供了诸如’Close’之类的方法,而这些方法又调用Dispose
我相信编译器会在尝试调用Dispose之前添加检查以确定它是否为null。
https://aspnetresources.com/blog/the_very_handy_using_statement.aspx
上述就是C#学习教程:将使用null工作吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/959308.html