最初,我假设是,因为我理解多播委托的调用列表是作为链表实现的,它支持常量时间插入和删除。但是,由于多播委托是不可变的,似乎任何添加/删除操作实际上都需要复制调用列表。这是正确的,还是我错过了什么?
注册/取消注册的成本很有意义,因为我有一个长期运行的应用程序经常将各种短期对象的处理程序注册到事件,然后在它们被处置之前取消注册它们。调用列表可能会相当长,所以我真的希望这是一个恒定的时间操作。
答案 0 :(得分:2)
调用列表可能会相当长,所以我真的希望这是一个恒定时间操作。
“相当”多长时间?除非你在谈论数千订阅者,否则它不太可能是一段重要的时间。
启动一个测试项目并试一试 - 实际测量结果胜过任何数量的聪明的老人(或女性)。
<强>更新强>
一想法:如果您的具体案例是针对处理对象的时间,请尝试以下方法:
public event PropertyChanged
{
add { mPropertyChanged += value; }
remove { mPropertyChanged -= value; }
}
public void Dispose()
{
mPropertyChanged = null;
}
在您的Dispose
方法中,您可以通过删除对存储事件的引用来放弃一次点击中的所有订阅。毫无疑问,这将比逐个取消订阅更快。
是的,你正在放弃垃圾收集器的多播委托,但是当你取消订阅的时候你也是这样做的 - 实际上每次取消订阅一次。
答案 1 :(得分:1)
根据Has Passant评论2011年8月22日21:31
添加是分摊的O(1),与List&lt;&gt; .Add()完全相同的逻辑。删除是O(n)。你无法改变这一点。