2012-03-01 3 views
2

클래스가 해당 메서드에서 이벤트를 발생시키는 경우 클래스는 이벤트를 구독하는 대상 또는 누가 알 필요가 없습니다. 구독자가있는 경우 중요하지 않습니다.구독자가 없을 수도있는 이벤트 처리

아래 코드에서 OnTrigger 이벤트 구독자가 없으면 예외가 발생합니다.

public class EventTrigger 
{ 
    public static void Main(string[] args) 
    { 
     (new EventTrigger()).Trigger(); 
    } 

    public delegate void Delegate1(); 
    public event Delegate1 OnTrigger; 

    void Trigger() 
    { 
     OnTrigger(); 
    } 
} 

다음과 같은 이벤트를 호출 할 수 있습니다.

if (OnTrigger != null) 
{ 
    OnTrigger(); 
} 

그러나 트리거가 구독에 대해 알 필요가 없기 때문에 나에게는 이상한 것처럼 보입니다.

내 질문은 :

내가 그것을 사용할 때마다 이벤트 참조가 null인지 확인해야합니까.

+1

주제에 대한 흥미로운 토론은 다음과 같습니다. http://stackoverflow.com/questions/248072/evil-use-of-extension-methods – ken

+0

나는 우주에서 혼자가 아닙니다. 그것은 나를 기분 좋게 만든다. 그러나 나는 그것이 좋은 접근법도 아니다라고 생각한다. 확장 메서드로 수행되기 때문에가 아닙니다. 왜냐하면 키보드 입력이 더 필요하기 때문에 더러워집니다. –

답변

2

OnTrigger을 초기화하면 확인하지 않아도됩니다. 예 :

public event Action OnTrigger = delegate { }; 

예 'delegate는 {} '이 당신이 확인 'null' 생략 할 수 있습니다 이유입니다, 새로운 객체를 인스턴스화합니다.

'delegate는 {} '당신이 (당신이 Delegate1 문자열을 반환하는 경우 필요) 문자열을 반환 할 경우, 그래서 "그럼 당신은 단순히"'return 추가, 아무 것도 반환하지 않습니다;'

예 :

public event Action OnTrigger = delegate { return string.Empty; }; 

내가 추가해야 할 것은 게으르다가 해킹 할 때 null 체크를 피하기 위해 이렇게하는 것은 나쁜 습관이라는 것입니다. 일부 코드는 여전히 이벤트를 null로 설정할 수 있습니다. 'OnTrigger = null'은 코드를 손상시킵니다. 그리고 직렬화에 관해서는 전혀 작동하지 않을 것입니다.

+0

감사합니다. 두 가지 질문이 있습니다. 1 등입니다. "위임 {};" 객체를 초기화 하시겠습니까? 그것은 무엇을 반환합니까? 2nd. 가치를 반환하는 델리게이트를 어떻게 처리 할 수 ​​있습니까? like : 공개 위임 문자열 Delegate1(); 공개 이벤트 Delegate1 OnTrigger = 위임 {}; –

+0

응답을 – Terkel

+0

업데이트했습니다. 빈 구독자를 포함하도록 이벤트를 초기화하는 것은 다소 어렵습니다. Delegate.Combine 및 Delegate.Remove는 훨씬 빠르게 대리인을 추가하거나 자체에서 대리인을 뺍니다. 그들은 다른 시나리오를 처리하고 있으며,'Delegate.Invoke'는 결합되지 않은 델리게이트를 처리하는 오버 헤드가 적습니다 (null 델리게이트의 호출을 건너 뛰는 것은 더미를 호출하는 것보다 빠릅니다). 예상되는 가입자 수가 1보다 큰 경우 빈 대표자를 추가해도 그리 좋지 않을 수도 있지만 최대 하나의 가입자가 예상되는 경우 낭비입니다. – supercat

1

트리거는 개별 가입자에 대해 알 필요는 없지만 구독에 대해 알아야합니다. 매번 null 체크를하거나 Simon의 해결 방법을 사용하십시오.

관련 문제