我有以下代码让GUI响应集合中的更改。如何取消订阅使用lambda表达式的事件?
myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());
首先这是一个好办法吗?
二:什么是从这个事件退订代码?它是相同的,但用 - =(然后再次完整的匿名方法)?
我有以下代码让GUI响应集合中的更改。如何取消订阅使用lambda表达式的事件?
myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());
首先这是一个好办法吗?
二:什么是从这个事件退订代码?它是相同的,但用 - =(然后再次完整的匿名方法)?
如果您需要一个事件来退订,你需要一个实例化的参考。不幸的是,这意味着你不能使用特定的语法。
首先...是它做这件事的好方法,它很干净,小巧的外形和容易阅读的&明白......当然是警告“除非你以后想退订”。
我相信Jon Skeet在此之前指出 “当涉及到使用匿名方法创建的委托的等价性时,该规范明确无法保证行为。
因此,如果您需要在以后的事件退订,你最好实际创建一个委托实例,所以你可以挂到基准供以后使用。
var myDelegate = delegate(sender, e){UpdateMyUI()};
myObservableCollection.CollectionChanged += myDelegate;
myObservableCollection.CollectionChanged -= myDelegate;
这是去一个好办法,除非myObservableCollection是要活的比“这个”时间越长,在这种情况下,你可以使用一个内存泄漏结束了,因为这是在幕后创建将节约一个委托参考你的'这个',这将保持它的活力。如果您反复创建并“摧毁”正在监听事件的任何内容,您会发现它们并未被垃圾收集器收集。
如果这是一个问题,你可以去在回答提出的路线,节省的处理程序,您必须首先创建一个参考。
另一种解决方案是使用弱引用来创建一个事件处理程序,这将允许收集用户如果没有其他的引用。我在this question and answer中探索过这个解决方案。
?Duplicate:http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c – Richard 2009-04-30 09:16:23
请参阅[this](http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method -in-C)。 – 2009-04-30 07:56:15
我没有把一个代表我的lambda表达式(如您的链接),所以我没有一个参考退订。 – 2009-04-30 08:03:37