1

これは、このコンテキストでイベントから dispose と unsubscribe を呼び出す権利ですか? 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 に答える