Lambda表达式和事件订阅

时间:2009-11-17 10:24:30

标签: c# events lambda

我听说如果lambda表达式用于订阅事件,那么这将创建对事件处理程序代码的弱引用,因此当订阅者死亡/不再需要时,不需要显式取消订阅该事件感兴趣。这是真的? 例如。

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

2 个答案:

答案 0 :(得分:2)

不,在事件订阅的上下文中,lambda表达式只是所有意图和目的的委托,因此仍然容易出现Lapsed Listener问题。所以不,这绝对不是一个弱的参考。

There are a variety of approaches for using weak references to work around this issue, which are summarised well in this post from Damien Guard

答案 1 :(得分:2)

不,这是神话。 Lambdas创建常规委托(至少在此用法中)。如果发布对象将在之前相同时间与订阅者一起完成,那么这种混淆通常很简单,则无需取消订阅。事件委托仅保留订阅者 aliver,而不是发布者

因此,在给出的示例中,这取决于您的发布商:aPersion(可能是一个人或类似人)将在表单/页面/已完成的任何内容之后使用