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



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

369   5  

5 ответов:

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

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

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

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

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

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

using ((IDisposable)null) { }

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

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

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

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

Comments

    Ничего не найдено.