2014-03-03 3 views
0

보일러 판은 가능성이 거의 모든 데이터 바인딩 예PropertyChangedEventHandler가 중복되지 않는 이유는 무엇입니까?

public event PropertyChangedEventHandler PropertyChanged; 
protected void OnPropertyChanged(string propertyName) 
{  
    PropertyChangedEventHandler handler = PropertyChanged; 
    if(handler!=null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

이 비록 중복 아닌가요 다음과 같다에서 볼 수 코드를 OnPropertyChanged를? 이 말을하기가 더 쉽지 않겠습니까

public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    {  
     if(PropertyChanged!=null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

나는 우리가 이것을하는 이유가있다라고 확신한다. 나는 그것을 찾을 수 없다.

답변

0

두 번째 구현을 사용하면 null 검사가 통과 된 후 대리인이 호출되기 전에 다른 스레드가 유일한 나머지 이벤트 처리기를 제거하여 null 심판 예외가 발생할 수 있습니다. 검사 전에 대리자를 복사하면 (대리자가 불변 인 경우 처리기를 제거하면 새 대리자를 할당한다는 의미이며 기존 대리인을 변경하지 않음) NRE를 사용할 수 없음을 의미합니다. 그러나 가능하면이 처리 된 후에 핸들러 이 호출되어 문제가 발생할 수 있습니다.

이벤트가 이벤트를 발생시키는 스레드 이외의 스레드에서 추가/제거 된 핸들러를 가지지 않는다는 것을 알고 있다면이 둘은 동일합니다.

+0

그러나 어느 경우이든 원래의 속성 변경 이벤트를 호출하고 있습니다. 따라서 등록이 취소 된 경우 여전히 null 참조 예외가 발생합니다. –

+0

@AMR 아니요. 내가 말했듯이, 대의원은 불변이다. 핸들러를 삭제하는 것은 참조 된 객체를 변경하는 것이 아니라 새로운 델리게이트를 생성하고이를 'PropertyChanged'에 할당하는 것입니다. 당신이 지역에 그것을 꺼낼 때 그것은 null이거나 그렇지 않을 것이다. 설정하는 데 사용 된 필드가 변경 되더라도 변경되지 않습니다. – Servy

관련 문제