2013-02-22 2 views
1

이벤트를 null로 설정하면 모든 대상이 효과적으로 분리됩니까? 대신 수동으로 모든 이벤트를 분리해야하는모든 이벤트 처리기를 제거하는 방법은 무엇입니까?

public class Test 
{ 
    public delegate void SomethingHappenedEventHandler(Test obj); 
    public event SomethingHappenedEventHandler SomethingHappened; 

    private void OnSomethingHappened() 
    { 
     if (this.SomethingHappened != null) 
      this.SomethingHappened(this); 

     //Once this event is fired, do not allow any more invocations! 
     this.SomethingHappened = null; 
    } 
} 

:

public class Thing 
{ 
    priavte Test Testing { get; set; } 

    public Thing() 
    { 
     this.Testing = new Test(); 
     this.Testing.SomethingHappened += DoSomething; 
    } 

    private void DoSomething(Test obj) 
    { 
     //Do some stuff. 
     //Detach manually. 
     this.Testing.SomethingHappened -= DoSomething; 
    } 
} 
+1

[이벤트를 Null로 설정] (0120-337-305) –

+0

이것은 거의 항상 잘못된 행동입니다. 어떤 코드가 이벤트를 구독했는지 알 수 없습니다. 2 단 발췌 부분의 문제가 아니라 가입자가 거기에서 제어됩니다. 사건을 일으키지 않으려면 단순한 일을 처리해야합니다. –

+0

@HansPassant 개체가 이런 방식으로 이벤트를 한 번만 발사하도록 허용하는 것이 왜 안 좋을까요? –

답변

2

예, null 효과적으로 목록에서 구독자를 제거합니다. 명심해야 할 것은 다음에 이벤트를 제기 할 때 NullReferenceException을 얻을 수 있다는 것입니다. 따라서 not null의 값을 확인하고 있으므로 괜찮을 것이지만 전화 할 때마다 확인하십시오.

+0

'private void OnSomethingHappened()'이미 null인지 확인합니다. "내부에서 null을 확인하는 해당 이벤트를 호출하는 별도의 메소드를 작성하는 것을 고려하십시오"라는 것이 무슨 뜻인지 잘 모르겠습니다. - 감사합니다. –

+0

이벤트를 null로 설정 한 후에도 호출 횟수가 계속 증가한다는 것을 알 수 있습니다. 이게 정상인가? –

+0

죄송합니다. OnSomethingHappend() 메서드를 호출하여 호출하면 아무 문제가 없습니다. 나는 그것을 빨리 읽었을뿐만 아니라 OnSomethingHappened()라고 부르는 연결을 만들지 않았습니다. 이것은 위임자를 호출하고 유효성을 검사하는 메소드를 호출함으로써 의미 한 것입니다. –

관련 문제