2012-02-23 20 views
10

Recentemente Sono stato informato che è possibile concatenare interi (e di altri tipi) a stringa e viceversa, cioèAggiunta di numeri interi in stringhe in C#

// x == "1234" 
// y == "7890" 
string x = "123" + 4; 
string y = 7 + "890"; 

Per qualche motivo non ho pensato questo tipo di cosa è stato permesso, quindi sono sempre stato con (dal NET 2) la forma:

// x == "1234" 
// y == "7890" 
string x = "123" + 4.ToString(); 
string y = 7.ToString() + "890"; 

dove gli interi vengono convertiti in stringhe. La versione precedente è sempre stata disponibile, e l'ho persa, o è qualcosa di nuovo in C# 4 (che è quello che sto usando ora)?

+0

E 'solo tipo di conversione in azione, sicuramente in giro nelle versioni precedenti. Probabilmente troverai entrambi compilati nello stesso modulo MSIL. – Rudu

+0

Oh, sì, guardando indietro ai documenti di standard di codifica vedo che sono stato incoraggiato ad essere esplicito nel mio codice per renderlo più leggibile. 'var x = value + 10' potrebbe essere qualsiasi cosa, per esempio, mentre 'string x = value + 10.ToString()' lascia poco all'immaginazione. –

risposta

17

Questo è sempre stato lì. + equivale a string.Concat() se almeno uno degli operandi è una stringa. string.Concat() ha un sovraccarico che accetta un'istanza object. Internamente chiamerà il metodo ToString() dell'oggetto prima della concatenazione.

Trovato l'apposita sezione nella C# spec - sezione operatore 7.7.4 Aggiunta:

concatenazione di stringhe:

string operator +(string x, string y); 
string operator +(string x, object y); 
string operator +(object x, string y); 

Il binario + operatore esegue la concatenazione di stringhe, quando uno o entrambi gli operandi sono di tipo stringa. Se un operando di concatenazione di stringhe è null, viene sostituita una stringa vuota. In caso contrario, qualsiasi argomento non stringa viene convertito nella sua rappresentazione stringa richiamando il metodo virtuale ToString ereditato dall'oggetto tipo. Se ToString restituisce null, viene sostituita una stringa vuota.

+0

Abbastanza sicuro che abbia qualche controllo nullo, quindi non è del tutto equivalente alla sola chiamata di .ToString sull'altro oggetto (se quell'oggetto è annullabile). – Servy

+4

Questo. Che cosa significa "+" dipende dal contesto in base al valore della mano sinistra. Se è numerico, è un'aggiunta matematica. Se è una stringa, è una concatenazione. Se si tratta di un tipo definito dall'utente, il metodo operatore definirà il/i tipo/i atteso/i del valore RValue e il comportamento dell'operatore dato un tipo RValue atteso. – KeithS

+0

Se 7 è sul lato sinistro del "+", dovrebbe chiamare l'operatore + su un numero intero. Sembra che supportino le stringhe lì. MSDN scrive "Console.WriteLine (5.0 +" 5 "); // concatenazione di stringhe // nota conversione automatica da doppio a stringa" << il commento è interessante – BlueM

2

Naturalmente, la risposta migliore è quella di utilizzare una qualche forma di:

String.Format("{0},{1}", "123", 4); 
+5

Perché esattamente questo è il migliore ?! – gdoron

+0

Sono d'accordo (essendo più esplicito, sebbene la tua forma non sia la stessa), non penso che l'aggiunta di stringhe e interi sia il miglior piano, specialmente quando ottieni codice come "var x = value + 10" –

+0

Prova ad usare il metodo String.Concat almeno se vuoi che il numero intero 1234 + "10" non finisca per essere 1244 questo ha senso – MethodMan

Problemi correlati