Вы можете опустить использование около SqlCommand
. GC в конечном итоге очистит его для вас. Тем не менее, я настоятельно советую вам не делать этого. Я объясню почему.
SqlCommand
косвенно наследуется от System.ComponentModel.Component
, и поэтому он наследует свой Finalizer
метод. Отсутствие вызова dispose на SqlCommand
гарантирует, что команда будет продвинута как минимум одно поколение после того, как она выйдет из области видимости (сборщик мусора .NET - это generational gc ). Например: когда команда была в поколении 1, она переходит в поколение 2. Завершаемые объекты хранятся в памяти дольше, чтобы обеспечить безопасную работу финализатора. Но не только сама команда хранится в памяти, но все объекты, на которые она ссылается, отправляются вместе с ней этому поколению. Объекты, на которые он будет ссылаться, это SqlConnection
, список SqlParameter
объектов, возможно большая строка CommandText
и многие другие внутренние объекты, на которые она ссылается. Эта память может быть удалена только тогда, когда это поколение собрано, но чем выше поколение, тем реже оно очищается.
Поэтому не вызов вызовет дополнительную нагрузку на память и дополнительную работу для потока финализатора.
Когда .NET не может выделить новую память, CLR вызывает сборку мусора всех поколений. После этого во время выполнения обычно снова будет достаточно места для размещения новых объектов. Однако, когда этот принудительный сбор происходит, когда в памяти много объектов, которые все еще необходимо преобразовать в следующее поколение (поскольку они являются финализуемыми или на них ссылается финализуемый объект), возможно, что CLR не сможет освободить достаточно памяти. OutOfMemoryException
будет результатом этого.
Должен признать, я никогда не видел, чтобы это произошло, потому что разработчики не располагали только своими SqlCommand
объектами. Тем не менее, я часто видел OOM в производственных системах из-за неправильной утилизации объектов.
Надеюсь, это даст немного предыстории о том, как работает GC и каков риск неправильной утилизации (финализируемого) объекта. Я всегда утилизирую все одноразовые предметы. Хотя просмотр Reflector может доказать, что это не обязательно для определенного типа, этот вид программирования приводит к тому, что код становится менее поддерживаемым и делает код зависимым от внутреннего поведения типа (и это поведение может измениться в будущем).