Действительно ли безопасно использовать 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
?
Да, Dispose()
вызывается только для не null объектов:
Да, перед Disposing ссылка будет проверена на null. Вы можете убедиться в этом, просмотрев свой код в Reflector.
По моему опыту, вы не получите исключение нулевой ссылки. Оно будет просто проигнорировано.
Расширение для с использованием
проверяет, не является ли объект нулевым
перед вызовом Dispose
на нем, так что да, это безопасно.
В вашем случае вы получите что-то вроде:
IDisposable x = GetObject("invalid name");
try
{
// etc...
}
finally
{
if(x != null)
{
x.Dispose();
}
}
Все должно быть в порядке:
using ((IDisposable)null) { }
Здесь нет исключения.
Боковое примечание: не путайте это с foreach
и IEnumerable
, где будет создано исключение.