2016-12-09 5 views
-1

このコンテキストでは、イベントの処分と退会をすぐに呼び出せますか? context_は、新しいものを作成することによって本質的に開始し停止する簡単なステートマシンを管理するために使用されます。C#Dispose()、イベントからの退会

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 
     } 
    } 

} 
+0

いいえ、あなたはIDisposable契約に違反しています。契約違反には注意が必要であり、コメントが多い。クラスが公開されていない限り、あなたはそれを手放すでしょう。 –

+1

実際のコードが本当にサンプルコードに似ていれば、本当に 'Dispose'を' Unsubscribe'にして、 'IDisposable'を実装するのではなく、"私の行うメソッドを作ることを許されていますか?欲しいロジック " – SimpleVar

答えて

0

正常に動作するオブジェクトでは、Dispose以外のクリーンアップを行う必要はありません。オブジェクトがそれよりも長く存続する可能性のある他のオブジェクトのイベントにサブスクライブする場合は、それらのイベントが何らかの形でクリーンアップされることを保証する必要があります。これは、弱いイベントを使用するか、またはDisposeがイベントサブスクリプションを処理することによって行われます。

「管理されていないリソース」という用語は、「管理されていないコード」という用語との関連性が最小であり、の通常のイベントは管理対象外のリソースです。したがって、イベントはアンマネージコードとは関係なく、IDisposableを使用してそれらをクリーンアップすることは、まさに正しいことです。実際、クリーンアップを確実にするために他の手段がないと(例えば、イベントが弱いイベントマネージャで処理されたり、イベントがサブスクライブされているオブジェクトがサブスクリプションを失うことがないなど)、そのようなクリーンアップは義務とみなすべきです。 WinFormsのコードは、イベントパブリッシャーが加入者を失うことはないと仮定すると、しばしば紛らわしいですが、それはそのようなスローピー性が望ましいと考えられるべきではありません。

関連する問題