этот вид «нет необходимости устанавливать объекты равными нулю после использования» не совсем точен. Есть моменты, когда вам нужно обнулять переменную после ее удаления.
Да, вы ВСЕГДА должны звонить .Dispose()
или .Close()
на все, что у вас есть, когда вы закончите. Будь то файловые дескрипторы, соединения с базой данных или одноразовые объекты.
Отдельно от этого стоит очень практичный шаблон LazyLoad.
Скажем, у меня есть и создан ObjA
из class A
. Class A
имеет публичную собственность под названием PropB
из class B
.
Внутренне, PropB
использует закрытую переменную _B
и по умолчанию имеет значение null. Когда используется PropB.Get()
, он проверяет, является ли _PropB
нулевым, и, если это так, открывает ресурсы, необходимые для создания экземпляра B
в _PropB
. Затем возвращается _PropB
.
По моему опыту, это действительно полезный трюк.
Когда возникает необходимость обнуления, если вы сбрасываете или изменяете A каким-либо образом, чтобы содержимое _PropB
было дочерним по отношению к предыдущим значениям A
, вам нужно будет удалить и сбросить нуль _PropB
поэтому LazyLoad может сбросить для получения правильного значения, если код требует этого.
Если вы только выполните _PropB.Dispose()
и вскоре после этого ожидаете, что проверка LazyLoad на ноль будет успешной, она не будет нулевой, и вы будете просматривать устаревшие данные. По сути, вы должны обнулить его после Dispose()
, просто чтобы быть уверенным.
Я, конечно, хотел бы, чтобы это было иначе, но сейчас у меня есть код, демонстрирующий это поведение после Dispose()
на _PropB
и вне вызывающей функции, которая выполняла Dispose (и, таким образом, почти вне области видимости), частный реквизит все еще не равен нулю, а устаревшие данные все еще там.
В конце концов, свойство disposed исчезнет, но, с моей точки зрения, это недетерминировано.
Основная причина, как указывает dbkk, заключается в том, что родительский контейнер (ObjA
с PropB
) сохраняет экземпляр _PropB
в области видимости, несмотря на Dispose()
.