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

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

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

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

有帮助吗?

解决方案

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

其他提示

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

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

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

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

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

这是一个不错的方法,除非myObservableCollection的寿命超过'this',在这种情况下你最终会出现内存泄漏,因为在幕后创建的委托将保留对你的''的引用这个',这将使它保持活力。如果你反复创建并“摧毁”正在收听事件的任何内容,你会发现它们没有被垃圾收集器收集。

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

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

scroll top