Когда использовать Слабые события?
Я ссылался на учебник MSDN о слабых событиях. Я понял основы. Я работаю над проектом, отличным от WPF, и мой класс подвергает определенные события. Мой вопрос в том, что слабые события
полностью заменить старый шаблон событий? Хорошо ли использовать его для всех классов, которые подвергают событиям? Каковы побочные эффекты либеральных слабых событий?
Ответы
Ответ 1
Основываясь на чтении, которое я сделал, не существует никаких конкретных негативов для использования WeakEvents, за исключением того факта, что это более подробно. Кроме того, вы должны в большинстве случаев вручную отменить регистрацию событий, когда они вам больше не нужны. В некоторых случаях это невозможно. Например, на странице MSDN, на которую вы ссылаетесь, упоминается, когда вы должны использовать WeakEvents:
http://msdn.microsoft.com/en-us/library/aa970850.aspx
Некоторые сценарии по своей сути поддаются применению шаблона слабых событий. Одним из таких сценариев является привязка данных. При связывании данных обычно исходный объект полностью не зависит от объекта-слушателя, который является объектом привязки. Многие аспекты привязки данных WPF уже имеют шаблон слабых событий, применяемый в том, как реализованы события.
Единственный человек, который представил любой тип негатива для них - это блог:
http://blog.catenalogic.com/post/2011/11/23/A-weak-event-listener-for-WPF-Silverlight-and-Windows-Phone-7.aspx
Есть несколько недостатков в использовании слабых прослушивателей событий в целом:
- Его обозначения уродливы, "оригинальный" способ .NET выглядит лучше.
- Вы должны назвать событие строкой, которая сосет (если вы знаете лучший способ, свяжитесь со мной!)
- Он может обрабатывать события только с обработчиком EventHandler
- Вы становитесь ленивым разработчиком, не заботящимся о подписках.
По существу, они должны использоваться для событий, которые ваши объекты будут подписываться на всю длину своего существования, и только отключаться от того, когда объекты будут расположены. Для всех остальных предпочтительным является использование традиционных событий и регистрация/отмена событий вручную.
Ответ 2
Есть два вопроса, которые необходимо учитывать при слабых событиях:
- Слабые события позволяют подписчикам подписываться на события (сообщения), даже не зная идентичности класса, поднимающего событие. В некоторых случаях может потребоваться даже необходимость. Однако в некоторых случаях это может привести к излишней сложности и уровню косвенности, что делает код более сложным для управления или контроля во время выполнения.
- Основным недостатком использования слабых событий является то, что он может побуждать разработчиков пренебрегать тем, от которого они отписываются от событий (сообщений). В этом случае обработчики событий могут быть вызваны даже после того, как подписчики "выйдут из сферы действия". Рассмотрим подписчика, который явно не отписывается и становится сборщиком мусора, но еще не собирался сбор мусора. Менеджер слабых событий не сможет обнаружить это состояние, и из-за этого он все равно вызовет обработчик события этого абонента. Это может привести ко всем неожиданным побочным эффектам.
Подробнее см. Незначительный шаблон событий.
Смотрите эту исходного кода, который иллюстрирует эту проблему с помощью обмена сообщений плагина MvvMCross как слабый менеджер событий.
Ответ 3
Когда использовать слабые события?
От MSDN
Прослушивание событий может привести к утечке памяти
Итак, вы должны использовать слабые события с целью избежать этих утечек
Хорошо ли использовать его для всех классов, которые подвергают событиям? Каковы побочные эффекты либеральных слабых событий?
См. Почему реализация событий на С# не использует шаблон слабых событий по умолчанию?. Утечка из "сильных" событий не такая обычная, слабые события имеют стоимость исполнения и имеют семантическую разницу, которая может быть нежелательной в каждом контексте, неправильное использование слабой ссылки может привести к тому, что событие прерывается, чтобы не срабатывать (в отличие от неправильное использование обычного события, вызывающего утечку памяти)
Пример утечки памяти, которую можно было бы избежать
Статические классы и синглтоны являются злодеями, когда говорят об утечках памяти, когда они приобретают ссылку на какой-либо другой объект, они будут препятствовать сбору мусора и, таким образом, утечка объекта для продолжительности жизни приложения, здесь является примером, где я встречался с необходимостью слабой ссылки, чтобы избежать утечки памяти