将使用null工作吗?

时间:2009-04-01 21:28:48

标签: c# idisposable

如果资源没有实现IDisposable,以下代码是否有效?

  T resource = new T();
  using (resource as IDisposable)
  {
     ...
  }

8 个答案:

答案 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