C#Dispose(),取消订阅事件

时间:2016-12-09 22:19:56

标签: c# events idisposable unsubscribe

这是否可以立即调用dispose并取消订阅此上下文中的事件? context_用于管理一个简单的状态机,我们基本上通过创建一个新的状态来启动和停止。

class ClassA
{

      StateContext context_;

      void SomeMethod()
      {
         if(context_ != null)
            context_.Dispose();

            context_ = new StateContext();

      }

   class StateContext : IDisposable
   {
        SubClassA()
        {
            //Subscribe to an event
        }   

        void Dispose()
        {
            //unsubscribe to an Event
        }
    }

}

1 个答案:

答案 0 :(得分:1)

一个行为良好的对象除了调用Dispose之外不应该要求清理。如果一个对象订阅了可能比其他对象更长的事件,它必须(表现良好)确保以某种方式清理这些事件。这可以通过使用弱事件,或通过让Dispose处理事件订阅来完成。

请注意,术语“非托管资源”与术语“非托管代码”的关系最小,而来自长期对象的普通事件是非托管资源。因此,即使事件与非托管代码无关,使用IDisposable清除它们也是完全正确的。实际上,我建议这种清理应该被认为是强制性的,除非存在确保清理的其他方法(例如,事件由弱事件管理器处理,或者事件被订阅的对象不会超过订阅者)。 WinForms代码通常是草率的,假设事件发布者不会超过订阅者,但这并不意味着这种邋is应该被认为是可取的。