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

Ars*_*eny 4 c# events

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

  • 首先,我想保证在MyClass中我只取消一次,即使代码只有少数方法.
  • 其次除了MyClass之外还有其他类使用OnMyEvent,因此我不想无意中取消订阅该类中的事件.

     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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 11

如果你只认购一次,没关系如何你很多次取消-取消订阅,当你没有订阅是无操作.同样,事件API的重点是您不能意外取消订阅其他订阅(其他类型或相同类型的其他实例).

因此,显示的代码应该没问题,尽管将两个调用移动到处理此问题的单个方法可能是值得的.但这可能是矫枉过正的.

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