取消订阅从未订阅过的事件是不是安全?

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事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )

事件订阅者是不是按订阅顺序调用?

C#事件订阅和取消订阅重复项

EventBus事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )

angular中全局订阅事件,包含取消订阅,非常好用

通过匿名委托取消订阅事件[重复]