2015-06-29 7 views
12

Wenn ich eine Klasse, die ich implementiert dann INotifyPropertyChanged Schnittstelle deklarieren, ReSharper wird diese Implementierung automatisch generieren:Bearbeiten von ReSharper der INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged; 

[NotifyPropertyChangedInvocator] 
protected virtual void OnPropertyChanged(string propertyName) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
} 

, die ich immer dabei, um bin der Bearbeitung:

public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

[NotifyPropertyChangedInvocator] 
protected virtual void OnPropertyChanged(string propertyName) 
{ 
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

Can Ich bearbeite irgendwie den automatisch erzeugten Code? Die Dokumentation von Resharper ist mir dabei weniger klar.

+3

Warum ist es so wichtig, die Fadensicherheit zu entfernen? Kopieren> check> invike ist eine bewährte Methode. –

+2

Ich könnte verstehen, auf C# 6 Standards zu ändern, wenn Sie VS 2015 verwenden, aber die hier beschriebene Änderung ist eine schlechte Änderung zu machen ... –

+0

Könnte mir bitte jemand erklären, wie die Änderung dieses Codes Thread-Sicherheit entfernt? Ich verstehe nicht, warum das eine schlechte Wahl ist. Warum müssen Sie kopieren/überprüfen/aufrufen, wenn Sie wissen, dass das Ereignis definiert wurde und _never_ null ist? Nicht kämpferisch sein; Ich verstehe es wirklich nicht. –

Antwort

5

Nein, Sie können den automatisch generierten Code nicht bearbeiten, da er beim Generieren eine Reihe von Möglichkeiten berücksichtigen muss - z. C# 6 verwendet den Operator ?. und muss auch verarbeiten, wenn das Ereignis bereits existiert und bereits initialisiert wurde.

Wenn Sie die Kurzversion verwenden möchten, die nicht über die lokale Variable und die Nullprüfung verfügt, können Sie zuerst das Ereignis erstellen und es mit =() => { }; initialisieren, bevor Sie die OnPropertyChanged-Methode generieren. Es ist jedoch wahrscheinlich am besten, die lokale var + null-Prüfung für Thread-Sicherheit zu behalten.

+0

Ich verstehe es nicht. Ich _am_ erstelle das Ereignis und initialisiere es mit '= delegate {}' - im Grunde das Gleiche. Können Sie näher erläutern, wie das Gewinde nicht sicher ist? –

+1

Nein, du hast Recht. Die 'delegate {}' Version ist threadsicher. Das Problem mit der lokalen var + null-Überprüfung besteht darin, sicherzustellen, dass ein Ereignishandler aufgerufen wird, und es gibt ein Threadsicherheitsproblem, wenn Sie das Ereignis direkt verwenden. Indem sichergestellt wird, dass es mindestens einen Ereignishandler mit dem leeren Delegaten gibt, wird dieser Thread-Sicherheitsaspekt behandelt. – citizenmatt

+0

Ich stimme Ihrer Schlussfolgerung zu, aber nicht Ihrer Prämisse. Das ist was eine Anpassung ist; Es ist nicht zu erwarten, dass jede Möglichkeit in Angriff genommen wird. Um Ihr Beispiel zu verwenden, wenn ich eine angepasste propertyChanged-Vorlage erstelle, möchte ich klar, dass sie genau die Syntax verwendet, die ich ihr gegeben habe. Es sollte nicht wichtig sein, ob "?." Zum Standard hinzugefügt wird oder nicht. Ich habe es nicht gesagt, es zu benutzen. Wenn und wenn ich mich dazu entschloss, meine Anpassung zu aktualisieren oder zum Standard zurückzukehren, kann sie '? .' verwenden. @ScottSEA Leider, wie gesagt wurde, ist es * nicht * eine Option in Resharper jetzt. Allerdings würde ich es als Feature-Anfrage einreichen. – Taekahn