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.

È stato utile?

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:

  1. 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 minuscolo string ), 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.

  2. 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 " "

http://blogs.msdn.com/brada /archive/2003/04/22/49997.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top