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

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

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI()); 

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

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

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

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

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

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

 var myDelegate = delegate(sender, e){UpdateMyUI()}; myObservableCollection.CollectionChanged += myDelegate; myObservableCollection.CollectionChanged -= myDelegate; 

这是一个好的方法,除非myObservableCollection比’this’活得更长,在这种情况下你最终可能会出现内存泄漏,因为在幕后创建的委托将保留对你的’this’的引用,这将使它保持活力。 如果您反复创建并“摧毁”正在侦听事件的任何内容,您会发现垃圾收集器并未收集它们。

如果这是一个问题,您可以转到答案中建议的路线,保留对处理程序的引用,您必须先创建该处理程序。

另一种解决方案是使用弱引用来创建一个事件处理程序,如果没有其他引用,将允许收集订阅者。 我在这个问题和答案中探讨了这个解决方案。