2011-11-27 81 views
3

我附加了一样,在构造函数行动:附加后我应该分离操作吗?

model.DataArrived += new Action<List<ConsoleData>>(model_DataArrived); 

我应该脱离它OnDispose?可以创建一个像这样的新实例吗?

protected override void OnDispose() 
    { 
     model.DataArrived -= new Action<List<ConsoleData>>(model_DataArrived); 

或者我应该分离完全相同的实例,我已经在构造函数中创建?我是否应该将这个实例保存在私有域中,仅用于分离目的?

+0

什么是OnDispose()?你的意思是'Dispose(布尔)'?如果是这样,你需要在'if(disposing)'检查中执行。 – SLaks

+1

而且你可以写得更短“model.DataArrived + = model_DataArrived;”和 - =相似。不是问题的答案,而是由于答案的改善... – erikH

+0

@SLaks我的意思是'System.IDisposable.Dispose()' – javapowered

回答

3

这很好。
代表按价值进行比较,而不是参考。

Delegate.Remove方法,和相应的操作员-,从第一个操作数中删除最后匹配委托。

只需要删除处理程序,如果model将比您的对象寿命更长。如果是这样,model中的事件将保持对您的对象的引用,使对象保持活动状态的时间过长。

+0

您可能想阅读我的[有关多播代表的博客文章](http://blog.slaks.net/2011/08/delegates-vs-function-pointers-addendum.html)。 – SLaks

1

我应该将它分离在OnDispose中吗?

是的。否则,模型实例会阻止收集此实例。

随着Slaks回答,-=表示法很好。

相关问题