2012-05-24 2 views
6

가능한 중복 : 빈 이벤트 핸들러를 항상 추가해도 괜찮습니까?

public event Action handler; … // some method: if(handler != null) handler(); 

빈을 할당의 단점이 있습니다 (C#에서) 이벤트 핸들러를 사용하는 경우

Is there a downside to adding an anonymous empty delegate on event declaration?

다음 패턴은 매우 일반적입니다 이 이벤트에 위임 하시겠습니까? 이렇게하면 이벤트가 발생하는 모든 곳에서 if !=null 조건이 저장됩니다. 물론 이벤트가 항상 적절한 대리인으로 지정되도록 보장 할 수없는 경우에만 적용됩니다.

public event Action handler; 
… 
// in constructor: 
handler +=()=>{}; 
… 
// some method: 
handler(); 

확실히 약간의 성능 저하가 있지만 코드를 훨씬 깨끗하게합니다. 그런 경우 가장 좋은 방법은 무엇입니까? 기술적 인 단점이 있습니까?

+0

제 생각에는 좋은 습관이 아닙니다. 네, null 체크를 저장했지만, 몇 달 후, 버그 나 유지 보수를위한 코드를 검사 할 때 첫 번째 예제는 코드의 목적을 더 잘 보여줍니다. – Steve

+1

보호 기능이 없으면 null을 검사하고 호출하는 사이에 'handler'가 null로 설정 될 수 있습니다. 'handler'의 값을 로컬 변수에 복사하고 _that_에 null을 체크해야합니다. –

+0

'handler'의 값을 지역 변수에 복사하지 않기 때문에 첫 번째 코드가 깨졌습니다. – CodesInChaos

답변

1

생성자에서 빈 대리자를 추가하는 대신 처리기가 null인지 먼저 확인하는 함수에서 처리기를 래핑 할 수 있습니다. 이것의 단점은 당신이 많은 이벤트를 가지고 있다면, 당신은 각 이벤트를 감싸는 많은 기능을 갖게 될 것입니다.

private void HandlerWrapper() 
{ 
    Action localHandler = handler; 
    if (localHandler != null) handler(); 
} 
+1

원본 코드와 동일한 스레드 안전성 문제 – CodesInChaos

1

재미있는 생각, 나는 그런 생각을 한 적이 없습니다. 내 사용자 지정 이벤트를 수행하는 방법은 이벤트에 대한 매개 변수를 취하는 OnCustomEventName을 만들고 거기에 null이 있는지 확인하는 것입니다. 그리고 내가 트리거 한 이벤트를 원할 때마다 코드에서 OnCustomEventName을 호출하십시오. 이벤트 발동을 방지 할 때마다 성능이 저하되는 것을 방지하고 작동 코드를 2 줄보다 더 깨끗하게 유지합니다.

이것은 기술적 인 단점에 대한 질문에 답하는 것이 아니라 이벤트를 발생시킬 때의 우수 사례에 대한 답입니다.

threadsafe "On"기능을위한 예제 코드.

private void OnCustomEventName() 
{ 
    DelegateName localhandler = CustomEventName; 
    if (localhandler != null) 
     localhandler(); 
} 
0

난 정말이 일을 어떤 큰 단점을 발견하지 않았으며 일반적으로 나는 널 (null)에 대한 검사에 그것을 선호합니다. 내가 생각할 수없는 유일한 문제는 디버깅 할 때 코드의 성가신 단계로 이어질 수 있다는 것입니다 (예 : 이벤트로 이동할 때마다 빈 대리자를 건너 뛸 필요가 있음).

성능이 문제가되지 않는다고 생각합니다. 응용 프로그램 성능이 이벤트를 호출하여 크게 저하되면 이벤트가 처음에는 없었을 것입니다.

관련 문제