Лямбда-выражения и подписки на события - PullRequest
3 голосов
/ 17 ноября 2009

Я слышал, что если лямбда-выражения используются для подписки на событие, то это создает слабую ссылку на код обработчика событий, поэтому нет необходимости явно отписываться от события, когда подписчик умирает / больше не существует интересно. Это правда? Например.

aPersion.PropertyChanged += (s, e) =>
                    {
                        if (e.PropertyName == "Name")
                        {
                            this.Name = this.TheController.Name;
                        }
                    };

Ответы [ 2 ]

2 голосов
/ 17 ноября 2009

Нет, это миф. Лямбды создают постоянных делегатов (по крайней мере, в этом случае). Часто путаница заключается в том, что если объект публикации будет завершен с до или примерно в то же время , что и подписчик тогда отписываться не нужно. Делегат события сохраняет только подписчика , а не publisher .

Таким образом, в данном примере это зависит от того, будет ли использоваться ваш издатель: aPersion (предположительно человек или подобное) после формы / страницы / независимо от того, что закончилось.

2 голосов
/ 17 ноября 2009

Нет, в контексте подписок на события лямбда-выражения являются просто делегатами для всех намерений и целей и, следовательно, остаются подверженными проблемам Lapsed Listener. Так что нет, это определенно не слабая ссылка.

Существует множество подходов к использованию слабых ссылок для обхода этой проблемы, которые вкратце изложены в этом посте от Дэмиена Гварда

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