取消订阅从未订阅过的事件是不是安全?
Posted
技术标签:
【中文标题】取消订阅从未订阅过的事件是不是安全?【英文标题】:Is it safe to unsubscribe from an event that has never been subscribed?取消订阅从未订阅过的事件是否安全? 【发布时间】:2014-10-29 22:51:25 【问题描述】:例如,如果这些代码:
Button button1 = new Button();
// ...
button1.Click -= button1_Clicked;
在之前执行:
button1.Click += button1_Clicked;
我没有发现错误或异常,但我想知道这里是否有任何缺点。
如果是安全的,为什么允许取消订阅从未订阅过的事件?
【问题讨论】:
你为什么希望它不是? 在我们先订阅之前取消订阅对我来说真的没有意义。 很公平,但请考虑List<T>
。如果你调用list.Remove(new T())
,它不会抛出异常。大多数 C# 集合类型最多会得到 false
的返回值。
【参考方案1】:
我找不到特定于事件的参考,但记录了事件使用的underlying functionDelegate.Remove
:
如果 value 为 null 或在 source 的调用列表中找不到 value 的调用列表,则返回 source
所以至少对于使用隐式访问器的事件来说是安全的。
自定义访问器完全是另外一回事,因为您可以根据需要实现remove
块。我会假设人们会模仿隐含的行为,但这不是强制的。
【讨论】:
在哪里可以找到此参考资料? MSDN 文档Delegate.Remove以上是关于取消订阅从未订阅过的事件是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章
EventBus事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )