Какие легкие события? - PullRequest
3 голосов
/ 04 мая 2010

Пробежал несколько раз в термине lightweight event. Тексты не сопровождались какими-либо фрагментами кода, чтобы понять идею, стоящую за этим термином.
Я был бы очень признателен, если бы кто-нибудь мог объяснить, что такое легкие события, и привести пример.

1 Ответ

4 голосов
/ 04 мая 2010

Когда вы добавляете обработчик события к событию (или, на самом деле, группу методов к делегату), делегат будет содержать ссылку на объект, на котором находится группа методов, если это метод экземпляра.

Другими словами, объект, запускающий события, будет удерживать ваш объект, который получает события, пока он подписан на событие.

Из-за этого, если вы покончили с этим объектом, который получает события, он все еще живет (и реагирует на события), даже если вы покончили с ним и освободите все ссылки (без отписки).

Это приводит к желанию lightweight events, то есть событий, которые не имеют ссылки.

Это , а не , предлагаемый по умолчанию в .NET Framework из коробки, поэтому, если вы хотите реализовать это, вам придется использовать добавление и удаление аксессоров при объявлении ваше событие вместе с WeakReference для хранения делегата, который передается через параметр неявного значения.

Затем, когда вы запускаете события, вы проверяете свою коллекцию WeakReference (для этого вам нужно сохранять это отдельно), в частности свойства IsAlive и Target , чтобы определить, делегат был собран. Если нет, то вы выполняете его, в противном случае вы проходите мимо (и, скорее всего, сжимаете свой список).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...