如何取消订阅使用lambda表达式的事件?

Ger*_*nck 26 .net c# lambda event-handling c#-3.0

我有以下代码让GUI响应集合中的更改.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());
Run Code Online (Sandbox Code Playgroud)

首先,这是一个很好的方法吗?

第二:取消订阅此活动的代码是什么?它是相同的但是 - =(然后又是完整的匿名方法)?

Eoi*_*ell 36

首先......是的,这是一个很好的方式,它是干净的,小的形式,易于阅读和理解......当然需要注意的是"除非你以后想取消订阅".

我相信Jon Skeet之前曾指出"当使用匿名方法创建的委托的等效性时,规范明确地不保证行为."

因此,如果您以后需要取消订阅该事件,您最好实际创建一个委托实例,以便以后可以挂起该引用.

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;
Run Code Online (Sandbox Code Playgroud)


J. *_*een 20

如果您需要取消订阅活动,则需要实例参考.不幸的是,这意味着您无法使用该特定语法.

  • 如果用"那个特定的语法"你的意思是创建lambda并在一行中添加处理程序,那么是的.简单的解决方案就是存储对lambda的引用.真的,我认为OP应该考虑使用普通的方法,如果他需要反复引用它 - 至少在我看来它提高了可读性. (2认同)