Вот что я понимаю об IDisposable и финализаторах из "CLR via C #", "Effective C #" и других ресурсов:
- IDisposable предназначен для детерминированной очистки управляемых и неуправляемых ресурсов.
- Классы, отвечающие за неуправляемые ресурсы (например, дескрипторы файлов), должны реализовывать IDisposable и предоставлять финализатор, чтобы гарантировать их очистку, даже если клиентский код не вызывает Dispose () в экземпляре.
- Классы, отвечающие только за управляемые ресурсы, никогда не должны реализовывать финализатор.
- Если у вас есть финализатор, вы должны реализовать IDisposable (это позволяет клиентскому коду делать правильные вещи и вызывать Dispose (), а финализатор предотвращает утечку ресурсов, если они забывают).
Хотя я понимаю причины и согласен со всем вышеперечисленным, есть один сценарий, в котором, на мой взгляд, имеет смысл нарушить эти правила: одноэлементный класс, отвечающий за неуправляемые ресурсы (например, предоставление единой точки доступа к определенным файлам. ).
Я считаю, что всегда неправильно иметь метод Dispose () для синглтона, потому что экземпляр синглтона должен жить в течение всего срока службы приложения, и если какой-либо клиентский код вызывает Dispose (), тогда вы набиты. Однако вам нужен финализатор, чтобы при выгрузке приложения финализатор мог очистить неуправляемые ресурсы.
Поэтому наличие одноэлементного класса с финализатором, который не реализует IDisposable, кажется мне разумным, но этот тип дизайна противоречит тому, что, как я понимаю, является передовой практикой.
Это разумный подход? Если нет, то почему и каковы лучшие альтернативы?