3

이 질문에는 이미 답변이 있습니다.

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인지 확인합니다. 그러나 이벤트는 델리게이트의 인스턴스 일 뿐이므로 코드를 작성하는 데 어떤 이점이 있는지 궁금합니다. 그렇다면 설명하십시오. 미리 감사드립니다.

2 답변


11

두 이벤트 모두 이벤트와 연결된 대리자가 null인지 확인합니다.

지역에 저장하는 목적은나는 너를 사랑해.멀티 스레드 코드에서의 스타일 경주.

로컬을 사용하면 두 가지 잠재적 인 레이스 중 하나만 제거된다는 점에 유의해야합니다.주제에 대한 내 2009 기사를 참조하십시오.http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx

또한이 질문 :

C #이벤트 및 스레드 보안


0

내가 아는 것에서대답, 첫 번째 스레드 안전하지 않은 반면 두 번째입니다.

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);
    }
}


  • 이는 두 가지 가능한 경합 조건 중 하나만 제거한다는 점에 유의해야합니다. 이것이 null을 역 참조하지는 않지만 이벤트 핸들러는 여전히 호출 될 수 있습니다.그것은 구독 취소 된 것으로, 이는 경주입니다. - Eric Lippert

연결된 질문


관련된 질문

최근 질문