Использование оператора с нулевым объектом - PullRequest
161 голосов
/ 26 марта 2010

Безопасно ли использовать оператор 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?

Ответы [ 5 ]

153 голосов
/ 26 марта 2010

Да, Dispose() вызывается только для ненулевых объектов:

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

30 голосов
/ 26 марта 2010

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

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

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}
12 голосов
/ 26 марта 2010

С вами должно быть все в порядке:

using ((IDisposable)null) { }

Здесь не исключение.

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

1 голос
/ 26 марта 2010

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

0 голосов
/ 26 марта 2010

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

...