Coalesce vs concatenazione di stringhe vuote
-
03-07-2019 - |
Domanda
Il mio collega è nuovo in C # e non sapeva dell'operatore di coalizione. Quindi, l'ho visto scrivere una riga di codice come questa:
string foo = "" + str;
L'idea è che se str è nullo, questa espressione restituirebbe una stringa vuota. Certo, potrebbe essere riscritto come questo:
string foo = str ?? "";
E penso che sarebbe più leggibile. Ma è davvero un grosso problema? I vantaggi della leggibilità sono sufficienti per suggerire di tornare indietro e far apparire quelle righe come la seconda? O è una di quelle cose che dovrei imparare a lasciar andare (a condizione che il mio collega sia istruito sul modo migliore per farlo in futuro)?
MODIFICA : solo una nota, apprezzo i commenti sull'efficienza, ma questo non viene realmente utilizzato in nessuna situazione in cui tale prestazione sarebbe critica. Quindi, sebbene queste informazioni siano interessanti, non è necessariamente quello che ritengo importante.
Soluzione
IMO, è molto meglio definire chiaramente tale logica, cioè non usare la concatenazione di stringhe per evitare la stringa nulla e usare l'istruzione condizionale o ?? operatore.
Per quanto riguarda altri commenti:
c'è anche un vantaggio in termini di prestazioni usando l'operatore a coalescenza nulla, poiché non è necessaria alcuna concatenazione (e, quindi, nessuna stringa aggiuntiva istanza è stata creata inutilmente)
Non vero. Compilatore C # compila " " + string2 allo stesso codice al 100% di string1 ?? & Quot; " ;. Inoltre il compilatore C # traduce l'operatore + per chiamare il metodo string.Concat che a sua volta controlla gli argomenti con la funzione string.IsNullOrEmpty e in questo caso non alloca una nuova stringa.
Vorrei anche raccomandare l'uso di String.Empty over " " come è un costante e non richiede il creazione di una nuova stringa
.NET framework supporta string interning quindi " " e stringa. Punto vuoto nella stessa area di memoria
Altri suggerimenti
Non credo che uno sia più leggibile dell'altro personalmente. Preferisco questo:
string foo = str ?? "";
semplicemente perché mi piace molto il ?? operatore.
Se sei un principiante, penso che sarebbe un po 'più facile da capire:
string foo = str == null ? "" : str;
o
string foo = "";
if (str != null) foo = str;
Tuttavia, devi chiederti, " Quanto semplice vuoi davvero ottenere? "
Mentre preferisco la seconda riga dal punto di vista tecnico, la prima riga è in realtà più leggibile per me ...
La seconda riga mi sembra più leggibile, chiarisce l'intento dell'espressione del lato destro.
Preferirei il tuo secondo esempio al primo in quanto è più proattivo rispetto a str
essendo nullo ed è più espressivo. Inoltre, consiglierei l'uso di String.Empty
su " "
poiché è una costante e non richiede la creazione di una nuova String
(e sì, questo è un nitpick estremo ma importante da notare).
Userei l'operatore di coalescenza o foo = str == null? & Quot; " : str;
per due motivi:
-
Il primo esempio non ha lo stesso comportamento in altri linguaggi di parentesi graffe (in particolare Java e JavaScript), in cui l'aggiunta di un riferimento null a una stringa vuota risulta in una stringa contenente il testo
null
. Di conseguenza, il primo esempio richiede uno sforzo mentale molto maggiore per garantire che si traduca in un comportamento corretto nella lingua che viene creata. Anche dati altri indizi è C # (come il tipo minuscolostring
), tutto ciò che richiede allo sviluppatore di rallentare e pensare "qual è lo scopo di questo codice" comporta una perdita di produttività. Potrebbe anche introdurre bug quando si passa da una lingua all'altra. -
Il secondo esempio esprime più chiaramente il intento del codice, che come descritto nella domanda originale è:
quando str è null impostato su una stringa vuota
A differenza del primo esempio, che può essere letto come:
imposta foo su una stringa vuota con str aggiunto (che può avere l'effetto collaterale di impostare foo su una stringa vuota quando str è nullo)
Come programmatori, dovremmo probabilmente tentare di esprimere l'intento del nostro codice, piuttosto che fare affidamento sugli effetti collaterali di altre operazioni per darci i risultati desiderati.
ecco un articolo su string.empty vs " "