2009-08-28 14 views
20

Microsoft Practice Test에서이 질문을 만났습니다. 혼란스러워했습니다. 여기에 질문 :C#에서 이벤트 발생

이벤트를 발생시킬 수있는 적절한 방법은 다음 C# 코드 샘플 의이다가, 는 알람 이벤트는 AlarmEventArgs 클래스와 AlarmEventHandler 위양이 되어 선언 한 가정?

AlarmEventArgs e = new AlarmEventArgs(1, 2); 
AlarmEventHandler handler = Alarm; 
if (handler != null) 
{ 
    handler(this, e); 
} 

그러나, 또한 올바른 것 같다 다른 응답이 : 여기

그들이 제공하는 "올바른"대답이다.

AlarmEventArgs e = new AlarmEventArgs(1, 2); 
if (Alarm!= null) 
{ 
    Alarm (this, e); 
} 

저는 개인적으로 항상 두 번째 방법을 사용합니다. 그것은 잘 작동합니다. 누군가 제 2의 대신에 첫 번째 방법을 사용해야하는 이유를 말해 줄 수 있습니까?

+2

가능한 복제본 [이벤트 발송 전에 null 확인 중 ... 스레드 안전?] (http://stackoverflow.com/questions/282653/checking-for-null-before-event-dispatching-thread-safe) – doppelgreener

답변

15

나는 비슷한 질문을했다. 받아 들여진 대답은 좋은 설명입니다. 다중 스레드 환경에서

Checking for null before event dispatching... thread safe?

+0

사용자 'Cherian'이 제안한 익명의 대리자 메서드는 아름답습니다. 손 - 아래 승자 :) –

+0

일단 당신이 머리를 얻을 다소 기능적인 개념 빈 핸들러는 괜찮아요 – spender

7

, 그것은 당신의 이벤트가 전달되는 동안 이벤트 핸들러가 업데이트 될 수 가능성이 있습니다. 이 시나리오를 피하려면 null을 확인하고 메시지를 보내기 전에 핸들러를 지역 변수에 할당하십시오.