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

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

168
задан BartoszKP 4 January 2016 в 18:40
поделиться

5 ответов

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

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

162
ответ дан 23 November 2019 в 20:56
поделиться

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

1
ответ дан 23 November 2019 в 20:56
поделиться

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

-3
ответ дан 23 November 2019 в 20:56
поделиться

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

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

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}
32
ответ дан 23 November 2019 в 20:56
поделиться

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

using ((IDisposable)null) { }

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

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

13
ответ дан 23 November 2019 в 20:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: