2011-01-20 8 views
15

è il check condizioni veramente ridondante nel seguente esempio ?:ridondante condizione di controllo prima assegnazione suggerimento per C# in ReSharper 5

public class MyClass  { 
    public bool MyProperty { get; set; } 

    public void DoSomething(bool newValue) { 
     // R# says: redundant condition check before assignment 
     // on the following line: 
     if (MyProperty != newValue) { // <====== 
      MyProperty = newValue; 
     } 
    } 
} 

So che in entrambi i casi MyProperty sarà impostato a newValue, ma è il controllo ridondante?

In Adobe Flex, il getter is called implicitly by the VM è in esecuzione ogni volta che viene chiamato un setter anche se non viene effettuato alcun controllo esplicito. Il risultato finale è che il controllo prima di un'assegnazione risulta in due controlli, uno esplicito e uno implicito, con conseguente controllo ridondante. Qualcosa di simile accade in C#?

risposta

10

Ci sono solo due situazioni in cui ho visto questo tipo di controllo.

Il primo è quando c'è una riga aggiuntiva di codice che imposta un'altra proprietà sull'oggetto su True per indicare che l'oggetto è stato modificato. Questo in genere viene utilizzato quando si tenta di decidere se mantenere lo stato dell'oggetto su qualcosa come un database.

La seconda situazione è quando i tipi in questione sono immutabili. Potresti voler evitare di impostare il valore e quindi creare una nuova stringa, ad esempio, quando i valori sono gli stessi. Anche allora, l'ho visto solo in alcune app in cui l'utilizzo della memoria è fondamentale.

+1

Nel mio caso è intorno a un Windows Form 'proprietà TopMost' che ha effetti collaterali. Ottimi punti riguardo i valori immutabili. –

1

Direi che il controllo è ridondante. Sarebbe più sensato se tu avessi un'implementazione di INotifyPropertyChanged, ma poi il controllo sarebbe nel setter per evitare di innescare l'evento se nessun cambiamento effettivo è fatto.

4

In questo caso specifico, è logicamente ridondante, poiché non è stato eseguito alcun codice nel getter, ma solo un involucro lineare attorno a un campo privato. Se hai l'abitudine di mettere cose nel tuo getter che avrebbero effetti collaterali, direi di disabilitare l'avviso R #.

Potrebbe valere la pena provare a mettere qualcosa nel getter della proprietà, e vedere se ReSharper pensa ancora che sia ridondante. Se lo fa, allora chiamerei un bug R #.

+1

Ho cambiato la proprietà in un 'int' e ho incrementato il valore nel getter e continuo a vedere lo stesso suggerimento, quindi lo considererò un bug di Resharper. –

+0

Buono a sapersi, grazie - terrò gli occhi aperti per quello scenario nelle mie cose. –

0

se (MyProperty != newValue) è ridondante, lasciando la linea sarà resa lo stesso risultato