c# - 在 C# 中取消订阅事件的正确方法是什么?

标签 c# events

我有一个模型类,其中包含我从其他类订阅的事件。我想正确订阅和取消订阅每个类(class)。

  • 首先,我想保证在 MyClass 中我只取消订阅一次,即使代码在少数方法中也是如此。
  • 其次,除了 MyClass 之外,还有其他类使用 OnMyEvent,所以我不想无意中取消订阅类(class)中的事件。

     MyClass(IModel model)
    {
      _model = model;
      _model.OnMyEvent +=EventHandle;
    }
    Close()
    {
     _model.OnMyEvent -=EventHandle;
    } 
    Disconnect()
    {
     //I want to check if OnMyEvent has already unsibscribed
     //Moreover OnMyEvent is used in other classes and
     //I don't want to mess up with it here 
     _model.OnMyEvent -=EventHandle;
    }
    

最佳答案

如果您只订阅一次,那么您取消订阅多少次并不重要 - 在您没有订阅的情况下取消订阅是无操作的。同样,事件 API 的全部意义在于您不能不小心取消订阅其他订阅(其他类型或相同类型的其他实例)。

因此,所示代码应该没问题,尽管将这两个调用移至处理此问题的单个方法可能是值得的。不过,这可能有点矫枉过正。

此外,如果您的类型是 IDisposable,请确保它也在该代码路径中被调用(大概是通过调用 Close())。

关于c# - 在 C# 中取消订阅事件的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436396/

相关文章:

c# - Url.Action 不包括端口号

events - 是否可以将事件附加到 PSObject?

javascript - 创建类来处理元素的点击和其他事件

ajax - <f :ajax> doesn't work on PrimeFaces component

c# - 了解流阅读器和内部缓冲区?

c# - 脚手架数据库错误

c# - 如何更改ArrayList的值

javascript - 加速 IE 中的多个 onmouseover 事件

multithreading - 引发事件,以便在与原始订阅者相同的线程上处理它们

c# - Azure SendGrid 提供的授权无效、已过期或已撤销