Chiamata ridondante a Object.ToString()
Domanda
Ho una funzione che accetta, tra gli altri, un parametro dichiarato come int privateCount.Quando voglio chiamare ToString() su questo parametro, ReSharper lo disattiva e lo contrassegna come chiamata ridondante.Quindi, curioso come sono, rimuovo ToString() e il codice continua a essere creato!
Come può un compilatore C# consentirlo, dove stra è una stringa?
str += privateCount +
...
Soluzione
L'operatore + per la stringa viene sovraccaricato per chiamare String.Concat passando nel lato sinistro e destro dell'espressione.Così:
string x = "123" + 45;
Viene compilato per:
String.Concat("123", 45);
Poiché String.Concat accetta due oggetti, il lato destro (45) viene racchiuso in un riquadro e su di esso viene chiamato ToString().
Si noti che questo "sovraccarico" non avviene tramite l'overloading dell'operatore nel linguaggio (ovvero non è un metodo denominato op_Addition) ma è gestito dal compilatore.
Altri suggerimenti
Non è solo una cattiva pratica, ma anche meno performante:L'intero deve essere boxato perché String.Concat prevede un oggetto mentre int.ToString() non richiede il boxing.
C# converte automaticamente gli oggetti in stringhe.Considera questa riga di codice:
aString = aString + 23;
Questo è C# valido;si compila in una chiamata a String.Concat(), che accetta due oggetti come argomenti.Questi oggetti vengono automaticamente convertiti in oggetti stringa per te.
La stessa cosa accade quando scrivi:
aString += 23;
Ancora una volta, questo viene compilato nella stessa chiamata a String.Concat();è solo scritto diversamente.
Questa è una cattiva pratica valida, poiché devi pensarci due volte se la variabile è una stringa o un int.Cosa succederebbe se la variabile si chiamasse myInt?
myInt = myInt + 23;
è più leggibile e comprensibile in questa forma?
myInt = mInt + "23";
o anche:
myInt = string.Format("{0}{1}", myInt, 23);
Sappiamo dal codice che si tratta di una stringa e non di un numero intero.