1

这是在这种情况下立即调用处置和取消订阅事件吗?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
        }
    }

}
4

1 回答 1

3

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

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

于 2016-12-16T15:49:01.307 回答