2010-11-03 18 views
50

Abbiamo un test unitario con variabile che contiene una stringa molto lunga.Riga continua carattere in C#

Domanda è come scrivere questo nel codice, senza problemi con interruzioni di riga o che il codice è difficile da leggere.

In VB c'è una linea continua carattere, c'è un equivoco in C#?

+1

creare un array, quindi unirlo. – leppie

+0

Possibile duplicato di [Multiline String Literal in C#] (http://stackoverflow.com/questions/1100260/multiline-string-literal-in-c-sharp) –

risposta

47

C# vi permetterà di avere una spaccatura stringa su più righe, il termine si chiama verbatim literal:

string myString = @"this is a 
        test 
        to see how long my string 
        can be 



        and it can be quite long"; 

Se siete alla ricerca per l'alternativa a & _ da VB, utilizzare il + ad unirsi le linee.

+8

myString verrà riempito con spazi bianchi. Non farlo. – caiosm1005

+6

Vale la pena farlo se si incorpora una stringa SQL nel codice. Il parser SQL non si preoccupa dello spazio bianco, ed è molto più semplice quando si trasferiscono tali istruzioni tra un programma e un client SQL. –

+2

ma pensa allo spreco di byte! – tofutim

5

È possibile utilizzare letterali testualmente:

const string test = @"Test 
123 
456 
"; 

Ma il rientro della prima linea è ingannevole/brutto.

0

È necessario utilizzare uno dei seguenti modi:

string s = @"loooooooooooooooooooooooong loooooong 
        long long long"; 

string s = "loooooooooong loooong" + 
      " long long" ; 
+7

Questi risultati in stringhe abbastanza diverse. Cioè, il primo è un personaggio di nuova linea. – Dykam

39

costanti stringa

Basta usare l'operatore + e rompere la corda fino in linee leggibile. Il compilatore capirà che le stringhe sono costanti e le concatena in fase di compilazione. Vedere la Guida alla programmazione MSDN C# here.

ad es.

const string myVeryLongString = 
    "This is the opening paragraph of my long string. " + 
    "Which is split over multiple lines to improve code readability, " + 
    "but is in fact, just one long string."; 

IL_0003: ldstr "This is the opening paragraph of my long string. Which is split over multiple lines to improve code readability, but is in fact, just one long string."

Variabili di stringa

notare che quando utilizzate interpolazione di stringhe per sostituire i valori nella stringa, che il carattere $ deve precedere ogni riga dove una sostituzione deve essere fatto:

var interpolatedString = 
    "This line has no substitutions. " + 
    $" This line uses {count} widgets, and " + 
    $" {CountFoos()} foos were found."; 

Tuttavia, questo ha il performance negativa conseguenza di più chiamate a string.Format ed eventuale concatenazione delle stringhe (contrassegnati con ***)

IL_002E: ldstr  "This line has no substitutions. " 
IL_0033: ldstr  " This line uses {0} widgets, and " 
IL_0038: ldloc.0  // count 
IL_0039: box   System.Int32 
IL_003E: call  System.String.Format *** 
IL_0043: ldstr  " {0} foos were found." 
IL_0048: ldloc.1  // CountFoos 
IL_0049: callvirt System.Func<System.Int32>.Invoke 
IL_004E: box   System.Int32 
IL_0053: call  System.String.Format *** 
IL_0058: call  System.String.Concat *** 

Anche se è possibile usare sia [email protected] per fornire una singola stringa e di evitare le prestazioni questioni, unless the whitespace is placed inside {} (che sembra strano, IMO), questo ha lo stesso problema come la risposta di Neil Knight, in quanto includerà qualsiasi spazi bianchi nei guasti di linea:

var interpolatedString = [email protected]"When breaking up strings with `@` it introduces 
    <- [newLine and whitespace here!] each time I break the string. 
    <- [More whitespace] {CountFoos()} foos were found."; 

La spaziatura iniettato è facile da individuare:

IL_002E: ldstr  "When breaking up strings with `@` it introduces 
    <- [newLine and whitespace here!] each time I break the string. 
    <- [More whitespace] {0} foos were found." 

Un'alternativa è di ripristinare string.Format. Qui, la stringa di formattazione è un singolo costante come per la mia prima risposta:

const string longFormatString = 
    "This is the opening paragraph of my long string with {0} chars. " + 
    "Which is split over multiple lines to improve code readability, " + 
    "but is in fact, just one long string with {1} widgets."; 

E poi valutato come tale:

string.Format(longFormatString, longFormatString.Length, CountWidgets()); 

Tuttavia, questo può ancora essere difficile da mantenere dato il potenziale separazione tra la formattazione stringa e i token di sostituzione.

+1

Infatti, Resharper tenterà di farlo automaticamente ogni volta che si preme Invio su una stringa letterale non terminata. – StuartLC

+1

Ecco come facciamo anche i nostri letterali a stringa lunga. Soprattutto per i messaggi di errore utili che tutti dovrebbero sforzarsi di fare! –

-3

Se si dichiara diverse variabili quindi utilizzare seguente metodo semplice:

Int salary=2000; 

String abc="I Love Pakistan"; 

Double pi=3.14; 

Console.Writeline=salary+"/n"+abc+"/n"+pi; 
Console.readkey(); 
Problemi correlati