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