Зачем вызывать Dispose() до выхода main()?

Служба My.net очищает все свои неуправляемые ресурсы, вызывая resourceName.Dispose() в блоке finally до выхода цикла Main().

Нужно ли мне это делать?

Я правильно понимаю, что я не могу утечки каких-либо ресурсов, потому что процесс заканчивается? Windows закроет все дескрипторы, которые больше не используются, не так ли?

Ответ 1

Нет ограничений для типов ресурсов, которые могут быть инкапсулированы объектом, реализующим IDisposable. Подавляющее большинство ресурсов, инкапсулированных объектами IDisposable, будет очищено операционной системой, когда процесс завершится, но некоторые программы могут использовать ресурсы, о которых операционная система ничего не знает. Например, приложение базы данных, которое требует шаблона блокировки, которое не поддерживается базовой базой данных, может использовать одну или несколько таблиц, чтобы отслеживать, какие вещи "проверены" и кем. Класс, который "проверяет" ресурсы, используя такие таблицы, может обеспечить в своем методе Dispose, что все будет проверено обратно, но если программа отключается без класса, имеющего возможность очистить таблицы, ресурсы, охраняемые этой таблицей будет оставлено болтающимся. Поскольку операционная система не имеет понятия, что означает любая из этих таблиц, у нее не было бы возможности их очистить.

Ответ 2

Скорее всего, пропустить это, в этом конкретном случае.

Первое, что нужно понять, состоит в том, что, хотя окончание процесса само по себе должно быть достаточным для очистки большинства вещей, возможно, что некоторые неуправляемые ресурсы будут оставлены в плохом или незакрытом состоянии. Например, у вас может быть приложение, лицензированное для каждого места, и когда приложение закрывается, вам нужно обновить запись базы данных где-нибудь, чтобы выпустить лицензию. Если процесс завершится некорректно, ничто не приведет к тому, что это обновление произойдет, и вы можете закончить блокировку людей из своего программного обеспечения. Просто потому, что ваш процесс завершается, не является оправданием, чтобы не делать очистки.

Однако в мире .Net с шаблоном IDisposable вы можете получить немного больше страховки. Когда процесс завершится, все остальные финализаторы будут запущены. Если шаблон Dispose() реализован должным образом (и что чем больше "если", чем должно быть), финализаторы все еще там, чтобы заботиться о любых оставшихся неуправляемых ресурсах для своих объектов...

Однако, это хорошая практика всегда иметь привычку правильно распоряжаться этими вещами самостоятельно. И FWIW, просто вызвать .Dispose() недостаточно, чтобы сделать это правильно. Ваш вызов .Dispose() должен быть включен как часть блока finally (включая неявный блок finally, который вы получите с помощью инструкции using).