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