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