我有以下代码让GUI响应集合中的更改。
myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());
首先,这是一个很好的方法吗?
第二:取消订阅此活动的代码是什么?它是相同的但是 - =(然后又是完整的匿名方法)?
答案 0 :(得分:35)
首先......是的,这是一个很好的方式,它干净,小巧,易于阅读和阅读。理解......当然需要注意的是“除非你以后想取消订阅”。
我相信Jon Skeet在此之前指出 “当涉及使用匿名方法创建的委托的等效性时,规范明确地不保证行为。”
因此,如果您以后需要取消订阅该事件,您最好实际创建一个委托实例,以便稍后可以挂起该参考。
var myDelegate = delegate(sender, e){UpdateMyUI()};
myObservableCollection.CollectionChanged += myDelegate;
myObservableCollection.CollectionChanged -= myDelegate;
答案 1 :(得分:20)
如果您需要取消订阅活动,则需要实例参考。不幸的是,这意味着您无法使用该特定语法。
答案 2 :(得分:1)
这是一个不错的方法,除非myObservableCollection的寿命超过'this',在这种情况下你最终会出现内存泄漏,因为在幕后创建的委托将保留对你的''的引用这个',这将使它保持活力。如果您反复创建并“摧毁”正在收听事件的任何内容,您会发现它们并未被垃圾收集器收集。
如果这是一个问题,你可以去答案中建议的路线,保留对处理程序的引用,你必须先创建它。
另一个解决方案是使用弱引用来创建一个事件处理程序,如果没有其他引用,将允许收集订阅者。我在this question and answer中探讨了这个解决方案。