2015-06-29 26 views
12

Kiedy mam klasę, która Oświadczam wdraża następnie INotifyPropertyChanged interfejs, ReSharper automatycznie wygenerować ten realizacji:Montaż ReSharper za INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged; 

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

który ja zawsze edycji być tak:

public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

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

Can W jakiś sposób edytuję automatycznie wygenerowany kod? Dokumentacja Resharpera jest dla mnie mniej jasna.

+3

Dlaczego usunięcie nici jest tak ważne? Copy> check> invike to najlepsza praktyka. –

+2

Mogę zrozumieć, chcąc zmienić na standardy C# 6, jeśli używasz VS 2015, ale zmiana opisana tutaj jest kiepską zmianą, aby ... –

+0

Czy ktoś mógłby mi wyjaśnić, jak zmiana tego kodu usuwa bezpieczeństwo wątku? Nie rozumiem, dlaczego to kiepski wybór. Dlaczego musisz kopiować/sprawdzać/wywoływać, gdy _know_ zdarzenie zostało zdefiniowane i czy _never_ null? Nie będąc wojowniczym; Naprawdę nie rozumiem. –

Odpowiedz

5

Nie, nie można edytować automatycznie generowanego kodu, ponieważ musi on obsługiwać wiele możliwości podczas generowania - np. C# 6 używa operatora ?., a także musi obsługiwać, gdy zdarzenie już istnieje i zostało już zainicjowane.

Jeśli chcesz użyć skróconej wersji, która nie ma zmiennej lokalnej i zerowej, możesz najpierw utworzyć zdarzenie i zainicjować je za pomocą =() => { }; przed wygenerowaniem metody OnPropertyChanged. Najlepiej jednak zachować lokalną kontrolę var + null, aby zapewnić bezpieczeństwo wątków.

+0

Nie rozumiem. I_am_ tworzenie zdarzenia i inicjowanie go za pomocą '= delegate {}' - w zasadzie to samo. Czy możesz wyjaśnić, w jaki sposób nie jest to bezpieczne dla wątków? –

+1

Nie, masz rację. Wersja 'delegate {}' jest bezpieczna dla wątków. Problem z lokalnym sprawdzeniem var + null polega na upewnieniu się, że istnieje procedura obsługi zdarzenia, i istnieje problem z bezpieczeństwem wątku, jeśli bezpośrednio korzystasz z tego zdarzenia. Upewniając się, że istnieje co najmniej jeden program obsługi zdarzeń, z pustym uczestnikiem, ten problem bezpieczeństwa związany z wątkiem jest obsługiwany. – citizenmatt

+0

Zgadzam się z twoim wnioskiem, ale nie twoim założeniem. Oto, czym jest personalizacja; Nie oczekuje się, że poradzi sobie z każdą możliwą możliwością. Aby użyć tego przykładu, jeśli utworzę niestandardowy szablon propertyChanged, wyraźnie chcę, aby używał dokładnie tej składni, której użyłem. Nie powinno mieć znaczenia, czy '? .' jest dodane do standardu czy nie. Nie powiedziałem, żeby to wykorzystać. Jeśli i kiedy postanowiłem zaktualizować moje dostosowanie lub wrócić do domyślnego, wówczas można użyć '?. '. @ScottSEA Niestety, jak stwierdzono, obecnie nie jest * opcją * w Resharper. Jednak przesłać go jako żądanie funkcji. – Taekahn