2011-01-22 3 views
1

나는 종종 이것에 대해 궁금해했다. 어떤 Foo에 대한 INotifyPropertyChanged의 다음 두 구현 중 어느 것이 더 낫거나 더 정확한 것인가? 이 트리거되는 불필요한 이벤트를 방지로다음 중 INotifyPropertyChanged를보다 정확하게 구현 한 것은 무엇입니까?

/* version A: */      |  /* version B: */ 
private bool foo;      |  private bool foo; 
public bool Foo      |  public bool Foo 
{          |  { 
    set        |  set 
    {         |  { 
             |   if (value != foo) 
             |   { 
     foo = value;     |    foo = value; 
     OnPropertyChanged("Foo");  |    OnPropertyChanged("Foo"); 
             |   } 
    }         |  } 
}          |  } 

(이 질문에 대한 관련이없는 나는 생략 한 모든.)

나는, 그 오른쪽에있는 버전 B를해야한다 생각한다. 그러나 이처럼 똑같이 놓친 사건이 문제를 일으킬 수있는 상황이 있습니까?

답변

5

버전 B는 속성이 실제로 값을 변경하지 않은 경우 이벤트를 발생시키지 않으므로보다 정확 해 보입니다. 버전 A에는 아무런 문제가 없으며 UI를 업데이트하지 않는 불필요한 호출 일뿐입니다.

그리고 documentation states

:

는 속성 값 이 변경된 것을 고객에게 통지합니다.

+0

B가 잠재적으로 문제가 될 수 있다고 생각하십니까? 즉 구독자가 속성을 *에 기록 할 때마다 (* 값이 변경된 것과 반대 *) 문제가 발생할 수 있습니다. – stakx

+3

@stakx, 나는 그런 상황을 생각할 수 없다. 인터페이스는 INotifyPropertyChanged이며 INotifyPropertyValueWasWritten이 아니므로 구독자는 값이 실제로 변경된 경우에만 알림을 받아야합니다. –

+0

매우 합리적인 지점, 그. 인터페이스가 버전 B와 비슷하게 구현 된 것을 거의 보지 못했지만 버전 A와 거의 비슷합니다. 어쩌면 게으름 때문일 수도 있습니다. 아무도 버전 A의 변호인이 없다면 나는 당신의 대답을 수락 할 것입니다. – stakx

관련 문제