Если объект, который вы используете, реализует IDisposable, он говорит вам, что должен сделать что-то важное, когда вы закончите с ним.Эта важная вещь может заключаться в освобождении неуправляемых ресурсов или отсоединении от событий, чтобы он не обрабатывал события после того, как вы думаете, что с ним покончено, и т. Д., И т. Д. Не вызывая Dispose, вы говорите, что знаете лучшео том, как работает этот объект, чем первоначальный автор.В некоторых крошечных крайних случаях это может быть действительно так, если вы сами создали класс IDisposable или знаете об ошибке или проблеме производительности, связанной с вызовом Dispose.В целом, очень маловероятно, что игнорирование класса, запрашивающего вас утилизировать его, когда вы закончите, является хорошей идеей.
Говоря о финализаторах - как уже указывалось, у них есть стоимость, которую можно избежатьУтилизация объекта (если он использует SuppressFinalize).Не только стоимость запуска самого финализатора, а не только стоимость ожидания завершения этого финализатора, прежде чем сборщик мусора сможет собрать объект.Объект с финализатором сохраняется в коллекции, в которой он идентифицирован как неиспользуемый и нуждающийся в финализации.Так что это будет повышаться (если это еще не во втором поколении).Это несколько ударов по эффектам:
- Следующее более высокое поколение будет собираться реже, поэтому после запуска финализатора, вы можете долго ждать, пока GC дойдет до этого поколения и подметает вашвозразитьТаким образом, освобождение памяти может занять гораздо больше времени.
- Это добавляет ненужное давление на коллекцию, в которую продвигается объект.Если он повышен с поколения 0 до поколения 1, то теперь поколение 1 будет заполняться раньше, чем нужно.
- Это может привести к более частым сборкам мусора в старших поколениях, что является еще одним ударом по производительности.
- Если финализатор объекта не завершен к тому времени, когда GC подходит к более высокому поколению, объект может быть снова продвинут.Следовательно, в плохом случае вы можете вызвать продвижение объекта из поколения 0 в поколение 2 без веской причины.
Очевидно, что если вы делаете это только с одним объектом, это вряд ли будет стоить вам ничегозаметно.Если вы делаете это как обычную практику, поскольку вам кажется, что вызов Dispose для объектов, которые вы используете, утомителен, тогда это может привести ко всем перечисленным выше проблемам.
Dispose - это как замок на входной двери.Вероятно, по какой-то причине, и если вы выходите из здания, вам, вероятно, стоит запереть дверь.Если это не было хорошей идеей, заблокировать его, не было бы блокировки.