【问题标题】:Will Dispose() be called in a using statement with a null object?是否会在带有空对象的 using 语句中调用 Dispose()?
【发布时间】:2010-03-26 11:22:44
【问题描述】:

在(可能的)空对象上使用using 语句是否安全?
考虑以下示例:

class Test {
    IDisposable GetObject(string name) {
        // returns null if not found
    }

    void DoSomething() {
        using (IDisposable x = GetObject("invalid name")) {
            if (x != null) {
                 // etc...
            }
        }
    }
}

是否保证Dispose只有在对象不为空的情况下才会被调用,而我不会得到NullReferenceException

【问题讨论】:

标签: c# idisposable using


【解决方案1】:

是的,Dispose() 仅在非空对象上调用:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

【讨论】:

  • 请注意,即使您的变量为 null,也会执行 using 块,如果您在 using 块中引用您的变量而没有先对其进行 null 检查,您将得到 NullReferenceException。为防止误解,此答案应说明:“是的,Dispose() 仅在非空对象上调用”。
【解决方案2】:

using 的扩展在调用 Dispose 之前检查对象不是 null,所以是的,它是安全的。

在你的情况下,你会得到类似的东西:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}

【讨论】:

    【解决方案3】:

    你应该没问题:

    using ((IDisposable)null) { }
    

    这里没有抛出异常。

    旁注:不要将此与foreachIEnumerable 误认为会引发异常。

    【讨论】:

      【解决方案4】:

      是的,在 Disposing 之前将对引用进行空值检查。您可以通过在 Reflector 中查看您的代码来检查自己。

      【讨论】:

        【解决方案5】:

        根据我的经验,您不会得到空引用异常。它将被简单地忽略。

        【讨论】:

          猜你喜欢
          • 2010-10-05
          • 1970-01-01
          • 2012-08-07
          • 2011-04-03
          • 1970-01-01
          • 2013-01-23
          • 1970-01-01
          • 2019-03-31
          • 1970-01-01
          相关资源
          最近更新 更多