如何删除lambda事件处理程序

10年前关闭。

在C#中取消订阅匿名方法

如何注销“匿名”事件处理程序

最近,我发现可以使用lambda创建简单的事件处理程序。例如,我可以订阅这样的click事件:

button.Click += (s, e) => MessageBox.Show("Woho");

但是您将如何退订呢?

回答:

C#规范明确声明(IIRC),如果您有两个匿名函数(匿名方法或lambda表达式),则可能会或可能不会从该代码中创建相等的委托。(如果两个代表具有相同的目标并引用相同的方法,则它们是相等的。)

当然,您需要记住您使用的委托实例:

EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;

...

button.Click -= handler;

(我找不到规范的相关部分,但是看到C#编译器积极尝试创建相等的委托人,我会感到非常惊讶。依靠它肯定是不明智的。)

如果您不想这样做,则需要提取一个方法:

public void ShowWoho(object sender, EventArgs e)

{

MessageBox.Show("Woho");

}

...

button.Click += ShowWoho;

...

button.Click -= ShowWoho;

如果您要创建一个使用lambda表达式删除自身的事件处理程序,则会有些棘手-

您需要在lambda表达式本身中引用委托,而不能通过简单的“声明局部变量并赋值”来实现使用lambda表达式将其添加到它”,因为该变量未得到明确分配。通常,您可以通过首先为变量分配空值来解决此问题:

EventHandler handler = null;

handler = (sender, args) =>

{

button.Click -= handler; // Unsubscribe

// Add your one-time-only code here

}

button.Click += handler;

不幸的是,将其封装到方法中甚至都不容易,因为事件没有被清晰地表示。您能找到的最接近的是:

button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) =>

{

// One-time code here

}, handler => button.Click -= handler);

即使在其中实现起来也很棘手,Delegates.AutoUnsubscribe因为您必须创建一个新的EventHandler(这只是一个泛型类型参数)。可行,但混乱。

以上是 如何删除lambda事件处理程序 的全部内容, 来源链接: utcz.com/qa/410552.html

回到顶部