이 질문에는 이미 답변이 있습니다.
C #에서 이벤트를 발생시키는 다양한 코딩 스타일을 보았습니다. 첫 번째 스타일은 다음으로 구성됩니다.
- 이벤트 핸들러
public delegate void NumberReachedEventHandler(object sender,
NumberReachedEventArgs e);
-이벤트
public event NumberReachedEventHandler NumberReached;
- 사건을 해고하는 방법
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
if(NumberReached != null)
{
NumberReached(this, e);
}
}
그러나 두 번째 스타일은 이벤트를 발생시키는 다른 방법이 있습니다.
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
NumberReachedEventHandler handler = NumberReached;
if(handler != null)
{
handler(this, e);
}
}
나에게 그것은 하나의 스타일이 "이벤트"가 null인지 확인하고 두 번째 스타일은 델리게이트가 null인지 확인합니다. 그러나 이벤트는 델리게이트의 인스턴스 일 뿐이므로 코드를 작성하는 데 어떤 이점이 있는지 궁금합니다. 그렇다면 설명하십시오. 미리 감사드립니다.
두 이벤트 모두 이벤트와 연결된 대리자가 null인지 확인합니다.
지역에 저장하는 목적은나는 너를 사랑해.멀티 스레드 코드에서의 스타일 경주.
로컬을 사용하면 두 가지 잠재적 인 레이스 중 하나만 제거된다는 점에 유의해야합니다.주제에 대한 내 2009 기사를 참조하십시오.http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx
또한이 질문 :
내가 아는 것에서이대답, 첫 번째 스레드 안전하지 않은 반면 두 번째입니다.
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
//If number reached is changed from after this check
if(NumberReached != null)
{
//and between this call, it could still result in a
//NullReferenceException
NumberReached(this, e);
}
}