2015-06-29 22 views
12

Quando ho una classe che dichiaro implementa poi INotifyPropertyChanged interfaccia, ReSharper genererà automaticamente questa implementazione:INotifyPropertyChanged di Editing ReSharper

public event PropertyChangedEventHandler PropertyChanged; 

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

che sto sempre di editing per essere questo:

public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

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

Can In qualche modo modifico il codice generato automaticamente? La documentazione di Resharper non mi è chiara su questo.

+3

Perché è così importante rimuovere la sicurezza del filo? Copia> verifica> invike è una best practice. –

+2

Potrei capire di volere passare agli standard C# 6 se stai usando VS 2015, ma la modifica qui descritta è una brutta modifica per rendere ... –

+0

Qualcuno potrebbe spiegarmi come cambiare questo codice rimuove la sicurezza dei thread? Non capisco perché questa sia una scelta sbagliata. Perché hai bisogno di copiare/controllare/invocare quando _know_ l'evento è stato definito ed è _never_ null? Non essere combattivo; Io davvero non capisco. –

risposta

5

No, non è possibile modificare il codice generato automaticamente, poiché è necessario gestire una serie di possibilità durante la generazione - ad es. C# 6 utilizza l'operatore ?. e deve anche gestire quando l'evento esiste già e è già stato inizializzato.

Se si desidera utilizzare la versione abbreviata che non ha la variabile locale e il controllo Null, è possibile creare prima l'evento e inizializzarlo con =() => { }; prima di generare il metodo OnPropertyChanged. Tuttavia, è probabilmente meglio mantenere il controllo var + null locale, per la sicurezza dei thread.

+0

Non capisco. Io _am_ creando l'evento e inizializzandolo con '= delegate {}' - fondamentalmente la stessa cosa. Puoi approfondire come questo non sia sicuro? –

+1

No, hai ragione. La versione 'delegate {}' è thread-safe. Il problema con il controllo locale var + null è assicurarsi che ci sia un gestore di eventi da richiamare, e c'è un problema di sicurezza dei thread se si utilizza direttamente l'evento. Assicurandosi che ci sia almeno un gestore di eventi, con il delegato vuoto, viene gestita la questione relativa alla sicurezza dei thread. – citizenmatt

+0

Sono d'accordo con la tua conclusione, ma non con la tua premessa. Questo è ciò che è una personalizzazione; Non è previsto che gestisca ogni possibilità. Per usare il tuo esempio, se creo un modello propertyChanged personalizzato, voglio chiaramente che utilizzi la sintassi esatta che gli ho detto di usare. Non dovrebbe importare se '? .' viene aggiunto allo standard o no. Non ho detto di usarlo. Se, e quando, ho deciso di aggiornare la mia personalizzazione o tornare al valore predefinito, allora può usare '? .'. @ScottSEA Sfortunatamente, come è stato detto, è * non * un'opzione in Resharper in questo momento. Tuttavia, lo invierò come richiesta di funzionalità. – Taekahn