2010-12-16 12 views
5

Ich habe folgendes Muster für die Umsetzung INotifyPropertyChangedMuster für die Implementierung von INotifyPropertyChanged?

private void NotifyPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

mir die Notwendigkeit des var Handler Property Zuordnung vor = für null im Vergleich zu direkt Überprüfung Property == null auf der Überprüfung erklären Kann jemand verwendet gesehen direkt?

Dank

+0

möglich Duplikat von [Warum erfordert C#, dass Sie jedes Mal, wenn Sie ein Ereignis auslösen, einen Null-Test schreiben ?] (http://stackoverflow.com/questions/3102918/why-does-c-require-you-to-writing-a-null-check-every-time-you-fire-an-event) – decyclone

+0

@decyclone Dies ist kein Duplikat ... Das OP fragt nicht, warum Sie überprüfen müssen, ob der Handler null ist, aber warum Sie eine lokale Kopie des Handlers verwenden müssen. –

+0

Ist dieses Muster für VB.NET erforderlich? Oder behandelt RaiseEvent dies für Sie? – MCattle

Antwort

4

Eric Lippert erklärt das ausführlich in diesem Blogartikel: Events and races.

Grundsätzlich besteht die Idee darin, eine Race-Bedingung zu vermeiden, falls ein anderer Thread den letzten Handler für dieses Ereignis abmeldet, nachdem Sie PropertyChanged != null überprüft haben, aber bevor Sie tatsächlich PropertyChanged aufrufen. Wenn Sie eine lokale Kopie des Handlers erstellen, kann dies nicht passieren (aber Sie könnten einen Handler aufrufen, der gerade abgemeldet wurde)

+0

Es liegt in der Hand des Teilnehmers, den Fall zu behandeln, in dem er gerade aufgerufen wird, nachdem er nicht abonniert wurde (unabhängig von der Ereignisquelle kann dieses Rennen nicht vermieden werden, ohne alle Nebenläufigkeit zu eliminieren). – Richard

0

In einer Multi-Threaded-Welt, werden die Property können auf Null nach dem gesetzt, wenn Anweisung ausgewertet wird.

1

Es ist die thread-sichere Methode, Ereignisse auszulösen. Wenn Sie das öffentlich zugängliche PropertyChanged-Ereignis lokal zuweisen, bevor Sie es verwenden, stellen Sie sicher, dass es zwischen der 'if'-Anweisung und der Zeile, die das Ereignis tatsächlich auslöst, nicht unterschiedlich ist.

Verwandte Themen