2016-12-09 10 views
-1

즉시이 컨텍스트에서 이벤트를 처리하고 구독을 취소 할 수 있습니까? context_는 기본적으로 시작하고 중지하는 간단한 statemachine을 관리하는 데 사용됩니다.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 코드는 이벤트 게시자가 구독자보다 오래 머물지 않는다는 가정하에 종종 엉망입니다. 그렇다고해서 그러한 슬픔이 바람직하다고 생각해서는 안됩니다.