Использование оператора с нулевым объектом

Можно ли использовать оператор 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 будет вызываться, только если объект не является нулевым, и я не получу a NullReferenceException?

Ответ 2

Расширение для using проверяет, что объект не является null перед вызовом Dispose, поэтому да, он безопасен.

В вашем случае вы получите что-то вроде:

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

Ответ 3

Вы должны быть в порядке:

using ((IDisposable)null) { }

Никакое исключение не было здесь.

Боковое примечание: не допускайте ошибки с помощью foreach и IEnumerable, где будет выбрано исключение.

Ответ 4

Да, перед удалением ссылка будет нулевой. Вы можете проверить себя, просмотрев свой код в Reflector.

Ответ 5

Вы не получите нулевое ссылочное исключение в соответствии с моим опытом. Он будет просто проигнорирован.