Я родом из С++, и я работаю с С# около года. Как и многие другие, я смущен тем, почему детерминированное управление ресурсами не встроено в язык. Вместо детерминированных деструкторов у нас есть шаблон размещения. Люди начинают задаваться вопросом, стоит ли распространять рак IDisposable через их код, стоит усилий.
В моем предвзятом мозге С++ кажется, что использование ориентированных на подсчет интеллектуальных указателей с детерминированными деструкторами - это важный шаг от сборщика мусора, который требует, чтобы вы реализовали IDisposable и call dispose, чтобы очистить ресурсы, не связанные с памятью. По общему признанию, я не очень умный... поэтому я прошу об этом исключительно из желания лучше понять, почему так оно и есть.
Что делать, если С# были изменены так, что:
Объекты подсчитываются. Когда счетчик ссылок на объекты обращается в нуль, метод очистки ресурсов называется детерминированным для объекта, тогда объект помечен для сбора мусора. Сбор мусора происходит в какое-то неопределенное время в будущем, когда память памяти восстанавливается. В этом случае вам не нужно реализовывать IDisposable или не забудьте вызвать Dispose. Вы просто реализуете функцию очистки ресурсов, если у вас есть ресурсы без памяти для выпуска.
- Почему это плохая идея?
- Неужели это победит цель сборщика мусора?
- Было бы возможно реализовать такую вещь?
EDIT: Из комментариев до сих пор это плохая идея, потому что
- GC быстрее без подсчета ссылок
- проблема обращения с циклами в графе объектов
Я думаю, что номер один действителен, но номер два легко справляется с использованием слабых ссылок.
Итак, оптимизация скорости перевешивает минусы, которые вы:
- не может своевременно освобождать ресурс без памяти.
- может освободить ресурс без памяти слишком скоро
Если механизм очистки ресурсов детерминирован и встроен в язык, вы можете устранить эти возможности.