В сложном приложении (включающем инверсию управления и довольно много классов) вряд ли возможно узнать, когда на определенный объект больше не будут ссылаться.
Первый вопрос. Предлагает приведенное выше утверждение о том, что в таком приложении есть недостаток дизайна, поскольку существует шаблон, говорящий: «Во всех ОО-программах речь идет об объектах, использующих другие типы объектов, чтобы упростить реализацию. Однако: Для любой созданный объект должен иметь владельца, который позаботится о его сроке жизни. "
Полагаю, можно утверждать, что традиционное неуправляемое ОО-программирование работает, как указано выше: некоторые владельцы в конечном итоге освободят / освободят используемый объект.
Однако преимущество управляемого языка в том, что в принципе вам больше не нужно заботиться об управлении жизненным циклом. До тех пор, пока на объект ссылаются так или иначе (обработчик события ...) и из любого места (может быть, не «владелец»), он живет и должен жить, поскольку он все еще используется.
Мне действительно нравится эта идея, и вам не нужно думать с точки зрения отношений с владельцем. Однако в какой-то момент в программе может стать очевидным, что вы хотите избавиться от объекта (или, по крайней мере, отключить его так, как этого не было бы).
IStoppable : предложение шаблона проектирования
Может существовать такой интерфейс, как «IStoppable», с методом «Stop ()» и событием «Stopped», чтобы любой другой объект, использующий его, мог удалить свои ссылки на объект. (Поэтому необходимо отключить их обработчик события OnStopped в обработчике события, если это возможно). В результате объект больше не нужен и будет собран.
Может быть, это наивно, но мне нравится верить в эту идею, что не будет неопределенного состояния объекта. Даже если какой-то другой объект пропущен для отмены регистрации в OnStopped, он просто останется в живых и все еще может быть вызван. Ничего не сломалось, просто удалив на него большинство ссылок.
Я думаю, что этот шаблон можно рассматривать как анархистский дизайн приложения, поскольку
- это основано на идее, что ЛЮБОЙ другой объект может управлять временем жизни IStoppable
- владелец не нужен
- было бы нормально оставить решение об отмене регистрации в IStoppable тем, кто его использует
- вам не нужно выбрасывать, уничтожать или выбрасывать - вы просто останавливаетесь и оставляете в живых (пусть GC сделает грязную часть)
IDisposable : из скетча и просто для проверки соответствующего шаблона:
Одноразовый шаблон предполагает, что вы все равно должны думать и работать как в неуправляемом ОО-программировании: избавьтесь от объекта, который вам больше не нужен.
- с использованием ваш друг в методе (очень удобно!)
- в противном случае - ваш собственный IDisposable реализация.
- после его использования / вызова Dispose вы не должны вызывать его больше: неопределенное поведение.
- реализация и ориентированность на ресурсы: речь идет не столько о том, когда и почему, сколько о деталях восстановления ресурсов
Итак, еще раз: в приложении, где я не имею в виду, если что-то, кроме «владельца», указывает на объект, трудно гарантировать, что никто не будет ссылаться на него и называть его больше.
Я прочитал о событии «Утилизация» в классе Component .NET. Есть ли вокруг него шаблон дизайна?
Почему я хотел бы думать с точки зрения одноразовых изделий? Почему я должен?
В управляемом мире ...
Спасибо!
Себастьян