2008-11-12 12 views

risposta

47

E 'fatto in fase di compilazione. Questo è esattamente equivalente a "string1string2string3".

Supponiamo di avere:

string x = "string1string2string3" 
string y = "string1" + "string2" + "string3" 

Il compilatore eseguirà appropriata internato tale che x e y si riferiscono agli stessi oggetti.

MODIFICA: Si parla molto di StringBuilder nelle risposte e nei commenti. Molti sviluppatori sembrano credere che la concatenazione delle stringhe dovrebbe essere sempre da fare con StringBuilder. Questa è una overgeneralisation - vale la pena capire why StringBuilder is good in some situations, and not in others.

3

La concatenazione viene eseguita in fase di compilazione, quindi non vi è alcun sovraccarico di runtime.

0

Non è possibile utilizzare uno StringBuilder?

+0

Facendo ciò renderebbe il codice meno leggibile * e * meno efficiente. In altre parole, sarebbe una brutta cosa da fare. –

+0

Abbastanza corretto, pensavo che se si stesse facendo un sacco di concatenazione, si consigliava il costruttore di stringhe? – Damien

+0

Se si esegue molta concatenazione durante il runtime, allora sì, si consiglia StringBuilder. Ma l'esempio precedente ha stringhe statiche, quindi il compilatore lo ottimizza già fino a una singola stringa. – Maxam

7

L'esempio verrà concatenato in fase di compilazione. Tutte le stringhe inline e le variabili const string sono concatenate in fase di compilazione.

Qualcosa da tenere a mente è che l'inclusione di qualsiasi stringa di sola lettura ritarderà la concatenazione al runtime. string.Empty e Environment.NewLine sono sia variabili stringa di sola lettura.

1

dipende davvero da quello che ti serve. In genere, se è necessario concatenare le stringhe, si ottengono le migliori prestazioni in runtime utilizzando StringBuilder. Se ti stai riferendo nel codice sorgente qualcosa come var str = "String1" + "String2" sarà convertito in string str = "String1String2" sulla compilazione. In questo caso non si ha nessuna overhead di concatenazione

+0

La tua generalizzazione è troppo generica: se puoi eseguire l'intera concatenazione in un colpo solo, di solito è più veloce (e più leggibile) rispetto all'utilizzo di StringBuilder. Quindi preferisci "x + y + z" al nuovo StringBuilder (x). Appendi (y). Appendi (z) .ToString(). StringBuilder è utile quando ci sono * ripetizioni * concatenazioni. –

+0

Al secondo punto di Jon ... StringBuilder è utile quando si esegue il looping ecc. Per un singolo set di operazioni, string.Concat è più semplice e funziona allo stesso modo. –

+0

Grazie Marc - Sarei a corto di spazio :) Modificato la mia risposta per indicare il mio articolo StringBuilder però ... –

37

Se lo spazio non è importante, è possibile utilizzare il carattere @ escape per scrivere stringhe multi-linea nel codice. Questo è utile se si dispone di una query nel codice, ad esempio:

string query = @"SELECT whatever 
FROM tableName 
WHERE column = 1"; 

questo vi darà una stringa con interruzioni di linea e schede, ma per una query che non importa.

1

StringBuilder è un buon modo per andare se avete più stringhe (più di circa quattro) da concatenare. È più veloce

L'utilizzo di String.Concat nell'esempio sopra riportato viene eseguito in fase di compilazione. Poiché sono stringhe letterali, sono ottimizzate dal compilatore.

Se invece utilizzate variabili:

string a = "string1"; 
string b = "string2"; 
string c = a + b; 

Questo viene fatto in fase di esecuzione.

+0

Il "più di 4" è rilevante solo quando si esegue il ciclo su un set di dati; in caso contrario, una singola chiamata a string.Concat (passando un array se necessario) è identica. –

+0

Quello che stai dicendo è vero. http://dotnetperls.com/Content/StringBuilder-Performance.aspx –

-3

StringBuilder sarà il tuo approccio più veloce se utilizzi qualsiasi quantità di stringhe.

http://dotnetperls.com/Content/StringBuilder-1.aspx

Se si sta solo facendo un paio di stringa (5 o meno è una buona regola) la velocità non importa di che tipo di concatenazione che si sta utilizzando.

+0

Il builder di stringhe è la soluzione * runtime * più veloce, ma l'espressione fornita sarebbe meglio valutata in fase di compilazione (che penso non dovrebbe essere un problema per il compilatore) – peterchen

0

C'è un modo per farlo. Il mio preferito utilizza il metodo di una stringa da C#. Campione uno:

string s = string.Format ("{0} {1} {0}", "Ciao", "Per"); Il risultato è s = "Hello By Hello";

Problemi correlati