193

Is it safe to use the using statement on a (potentially) null object?
Consider the following example:

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

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

Is it guaranteed that Dispose will be called only if the object is not null, and I will not get a NullReferenceException?

StayOnTarget
  • 9,925
  • 10
  • 45
  • 68
Paolo Tedesco
  • 52,498
  • 33
  • 138
  • 187

5 Answers5

188

Yes, Dispose() is only called on non-null objects:

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

BartoszKP
  • 33,416
  • 13
  • 100
  • 127
reko_t
  • 53,784
  • 10
  • 85
  • 77
  • 37
    Note that even if your variable is null, the using block is executed, and if you reference your variable inside the using block without first null-checking it, you WILL get NullReferenceException. To prevent misinterpretation, this answer should state: "Yes, `Dispose()` is only called on non-null objects". – surfen Nov 28 '11 at 09:05
44

The expansion for using checks that the object is not null before calling Dispose on it, so yes, it's safe.

In your case you would get something like:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}
Andriy Volkov
  • 18,157
  • 9
  • 67
  • 79
João Angelo
  • 54,484
  • 12
  • 137
  • 144
18

You should be ok with it:

using ((IDisposable)null) { }

No exception thrown here.

Side note: don't mistake this with foreach and IEnumerable where an exception will be thrown.

Darin Dimitrov
  • 994,864
  • 265
  • 3,241
  • 2,902
1

Yes, before Disposing the reference will be null-checked. You can examine yourself by viewing your code in Reflector.

oli
  • 74
  • 1
-2

You will not get null reference exception as per my experience. It will be simply ignored.

malay
  • 1,428
  • 4
  • 17
  • 28