Domanda

Ho appena provato la seguente, con l'idea di concatenare le due stringhe, sostituendo una stringa vuota per i valori nulli.

string a="Hello";
string b=" World";

- Debug (? Divertente che è la stampa, non esattamente aiutare la leggibilità ...)

 ? a ?? "" + b ?? "" 

-> "Ciao"

corretta è:

? (a??"")+(b??"")
"Hello World"

Ero un po 'aspettavo "Ciao Mondo", o semplicemente "World", se a è nullo. Ovviamente questo è todo con precedenza degli operatori e può essere superata da parentesi, c'è da nessuna parte che documenta l'ordine di precedenza per questo nuovo operatore.

(Rendendosi conto che dovrei probabilmente utilizzerò StringBuilder o String.Concat)

Grazie.

È stato utile?

Soluzione

A parte quello che ci si come la precedenza di essere, ciò che è in base alla ECMA, che cosa è in base alle specifiche SM e ciò che realmente fa csc, ho un po 'di consigli:

Non fare questo .

Credo che sia molto più chiaro a scrivere:

string c = (a ?? "") + (b ?? "");

In alternativa, dato che null in concatenazione stringa finisce per essere solo una stringa vuota comunque, basta scrivere:

string c = a + b;

EDIT: Per quanto riguarda la precedenza documentato, sia nel C # 3.0 spec (documento Word) e ECMA-334 , inoltre si lega più stretto di ??, che si lega più stretto di assegnazione. Il collegamento MSDN data in un'altra risposta è semplicemente sbagliato e bizzarro, IMO. C'è un cambiamento illustrato nella pagina fatta nel luglio 2008 che ha spostato l'operatore condizionale - ma a quanto pare in modo non corretto

Altri suggerimenti

Non contare sulla priorità degli operatori. sempre in modo esplicito specificare come si desidera il codice di agire. Fate voi stessi e gli altri un favore per quando si torna al codice.

(a ?? "") + (b ?? "")

Questa non lascia spazio ad ambiguità. L'ambiguità è il terreno di coltura di bug.

La precedenza degli operatori è documentato su MSDN .

Tuttavia la precedenza su MSDN contraddice la precedenza sia nel scaricabile C # spec anche da Microsoft, e la specifiche su ECMA . Che è un po 'strano.

A prescindere, come ha detto Jon Skeet nella sua risposta, meglio non fare affidamento sulla precedenza degli operatori, ma per essere esplicita attraverso l'uso di parentesi.

E 'interessante il fatto che http://msdn.microsoft.com/en- us / library / 6a71f45d.aspx e http: // it .csharp-online.net / ECMA-334:. _14.2.1_Operator_precedence_and_associativity dare la precedenza diverso a ??

MSDN:

  1. condizionale
  2. Assegnazione
  3. Null-coalescenza
  4. Lambda

ECMA:

  1. Null coalescenza
  2. condizionale
  3. Assegnazione

Credo che MSDN deve essere sbagliato, prendere in considerazione:

string a = null;
string b = a ?? "foo";
// What is b now?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top