如果资源没有实现IDisposable,以下代码是否有效?
T resource = new T();
using (resource as IDisposable)
{
...
}
答案 0 :(得分:16)
是。 using
语句会检查是否给出了null
,并且如果是这样,则会避免尝试调用Dispose
。
来自C#3规范的第8.13节:
将using语句翻译成 三个部分:获取,使用和 处置。资源的用法是 隐含在try语句中 包括finally子句。这个 最后的条款处理 资源。如果是空资源 获得,然后没有调用Dispose 做了,也没有例外。
答案 1 :(得分:10)
是的,它会起作用,请检查此运行测试:
[TestMethod]
public void TestMethod8()
{
using (new MyClass() as IDisposable)
{
}
}
public class MyClass { }
它运行没有任何问题。如果相应的类实现了IDisposable,它将调用它,如果不是它仍将工作/运行:)。
更新:正如其他人所说,我也想知道你想给它带来什么用途。我的猜测是你有类似工厂的东西,可以从不同的类中获取实例,这可能是也可能不是一次性的。)。
答案 2 :(得分:2)
即使不是处理资源的“正确”方法,它也应该可以正常工作。 <{1}}声明只是
的语法糖using
因此,如果o从未实现IDisposable o = ...;
try
{
// ...
}
finally
{
if (o != null)
o.Dispose(true);
}
,则IDisposable
语句中它将为空,并且会尝试在其上调用using
。
答案 3 :(得分:2)
在测试代码时,它似乎不会导致任何编译或运行时错误。
从语言定义(见8.13节): -
如果获得了空资源,那么 没有调用Dispose,没有 抛出异常。
如果类型不能转换为IDisposible,则as运算符会将资源转换为null,并且封装在using块中的代码将执行完全正常,行为与未将其包含在using块中的行为完全相同。
简而言之,您的问题的答案是肯定的。
答案 4 :(得分:1)
如果通过“它会工作”你的意思是你会得到运行时错误吗?不,你不会。
答案 5 :(得分:1)
这有什么用? 有什么好处? 有什么好处?
using语句将确保调用Dispose方法,但如果您的对象没有实现IDisposable,我认为没有使用这样做? 它会工作(因为,它不会抛出运行时异常,它会编译),我刚刚在这里测试但是......
使用您写下的代码,您甚至无法将资源用作IDisposable ......
答案 6 :(得分:1)
当类型显式实现IDisposable时,它可能很有用,在这种情况下,Dispose方法不能直接访问类型,除非类型被转换为IDisposable,使用'as'进行安全转换并确保调用Dispose 。在大多数情况下,当类型显式实现IDisposable时,它提供诸如'Close'之类的方法,后者又调用Dispose
答案 7 :(得分:0)
我相信编译器会在尝试调用Dispose之前添加检查以确定它是否为null。
http://aspnetresources.com/blog/the_very_handy_using_statement.aspx