是否所有注册事件的对象都是 IDisposable

Should all Objects that register events be IDisposable

根据我的理解,当不再需要某个对象时,最佳做法是取消订阅任何订阅事件的对象中的所有事件处理程序。

这样做是为了避免在给定对象可能处于无效状态时处理对象内的事件(毫无疑问,还有其他我可能不知道的原因)。

鉴于上述情况,我发现自己在所有注册任何形式的事件处理程序的对象上实施 IDisposible。但是,这显然会导致必须在给定对象上显式调用 Dispose() 的复杂性。

最后,我发现自己不确定是否需要这种额外的复杂性,或者我是否应该简单地在对象析构函数中执行事件取消订阅。然而,鉴于对象破坏是不确定的,这显然留下了意外行为的可能性。

那么所有注册事件的对象都应该是IDisposable吗?或者是否有更适合的替代方法?

你说的应该取消订阅事件是正确的,因为如果你不这样做也会导致内存泄漏。

我不确定是否有建议或标准的方法来执行此操作,但如果 class 需要清除内容,那么它通常会实现 IDisposable。

另一种方法是 'remember' 在正确的地方取消订阅 - 至少 IDisposable 使这一点更加明显,对于以后访问您的代码的人来说尤其重要。

我建议,如果一个对象订阅了来自外部对象的通知,无论这些对象是使用事件,IObservable,还是其他订阅方式,处理该对象应该确保这些订阅被取消;最自然的方法是使用外部对象支持的正常取消方式。

我进一步建议,如果一个对象接受来自外部对象的订阅请求,它应该销毁对这些对象的引用 if/when 很明显,不会再向这些订阅者发送任何通知。通常,一旦一个对象发送了 Dispose 本身需要的任何通知,它就不必发送任何进一步的通知,因此应该销毁它的订阅列表,除非它的语义要求它们超出此范围。

虽然 .NET 事件模式无法方便地确保订阅被取消,但无法取消来自共享对象的订阅通常会导致代码 "usually" 可以工作,但会有一些困难-验证要求。如果创建并保留了几个对象,或者创建了无限个对象并全部放弃,则对象之间的相互引用不会导致内存泄漏,因为在前一种情况下,即使相互引用也需要保留对象不存在,在后一种情况下,尽管相互引用,它们将不复存在。但是,如果创建的对象数量不受限制,但全部 但只有少数 被放弃,这可能是灾难性的。即使许多对象的消费者自然会遵守一种或另一种使用模式,要求所有人必须遵守一种或另一种,而不指定哪种模式是可接受的,这是相当尴尬的。