我应该在附加后分离操作吗?

3
我在构造函数中添加了以下操作:
model.DataArrived += new Action<List<ConsoleData>>(model_DataArrived);

我应该在OnDispose中分离它吗?像那样创建一个新实例可以吗?

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

我应该分离构造函数中创建的完全相同的实例吗?我是否应该仅将此实例保留在私有字段中以供分离目的使用?


什么是 OnDispose()?你是指 Dispose(bool) 吗?如果是这样,你需要在 if (disposing) 检查内执行它。 - SLaks
1
你可以写成更简短的形式"model.DataArrived += model_DataArrived;",减法操作也是类似的。这不是对问题的回答,但是感谢这个答案进行了改进... - erikH
@SLaks 我的意思是 System.IDisposable.Dispose() - Oleg Vazhnev
@erikH 谢谢,有了这样的改进,问题会自动得到回答。 - Oleg Vazhnev
请注意,这只是您已经在做的简写;它并没有任何不同。(这是 C# 2 中的新功能) - SLaks
2个回答

3

没问题。

委托按值进行比较,而不是按引用进行比较。

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

只有在model的生命周期长于您的对象时才需要完全删除处理程序。如果是这样,model中的事件将保留对您的对象的引用,导致您的对象存在太长时间。


你可能想阅读我关于多播委托的博客文章。链接在此:http://blog.slaks.net/2011/08/delegates-vs-function-pointers-addendum.html。 - SLaks

1
我应该在OnDispose中分离它吗?
是的。否则,模型实例将阻止此实例被收集。
正如Slaks所回答的那样,-=符号表示法是可以的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接