将使用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。

http://aspnetresources.com/blog/the_very_handy_using_statement.aspx