Come inserire newline in string letterale?


155

In .NET posso fornire sia \ro \nstringhe letterali, ma c'è un modo per inserire qualcosa come "nuova linea" carattere speciale come Environment.NewLineproprietà statica?


9
Qual'è la domanda?
iburlakov,

Risposte:


319

Bene, le opzioni semplici sono:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • Concatenazione di stringhe:

    string x = "first line" + Environment.NewLine + "second line";
  • Interpolazione di stringhe (in C # 6 e successive):

    string x = $"first line{Environment.NewLine}second line";

Puoi anche usare \ n ovunque e sostituire:

string x = "first line\nsecond line\nthird line".Replace("\n",
                                                         Environment.NewLine);

Nota che non puoi renderlo una costante di stringa , perché il valore di Environment.NewLinesarà disponibile solo al momento dell'esecuzione.


1
Bene, grazie ovviamente, ma intendevo evitare l'uso di Environment.NewLine, la mia domanda era se c'è letterale '/ newline'.
Capitano Comic,

2
@Captain: Perché vuoi evitare Environment.NewLine? Al contrario, è una buona pratica usarlo
abatishchev,

18
@abatishchev: in alcuni punti è una buona pratica. Negli altri non lo è. Devi davvero sapere che vuoi usare quello specifico per la piattaforma. Ad esempio, non è una buona idea se si utilizza un protocollo di rete che dovrebbe definire gli stessi terminatori di linea.
Jon Skeet,

1
@Captain Comic: la mia frase finale spiega perché non può essere una fuga letterale - non puoi includerla nei metadati per una costante di stringa, perché non è un valore costante.
Jon Skeet,

1
Sì, forse sono stato riluttante a causare entrambe le opzioni: uno che utilizza l'operatore plus e il secondo che utilizza il metodo Format sono un sovraccarico in cui l'iniezione di "\ newline" letterale sarebbe il modo più veloce. Ma, come ha detto Jon, NewLine, se esistesse, dovrebbe essere dinamico e dipendente dalla piattaforma.
Capitano Comic,

33

Se vuoi una stringa const che contenga Environment.NewLine, puoi fare qualcosa del genere:

const string stringWithNewLine =
@"first line
second line
third line";

MODIFICARE

Poiché questo è in una stringa const, viene eseguito in fase di compilazione, pertanto è l'interpretazione del compilatore di una nuova riga. Non riesco a trovare un riferimento che spieghi questo comportamento, ma posso provare che funziona come previsto. Ho compilato questo codice sia su Windows che su Ubuntu (con Mono) quindi disassemblato e questi sono i risultati:

Disassemblare su Windows Disassemblare su Ubuntu

Come puoi vedere, in Windows le nuove righe vengono interpretate come \ r \ n e su Ubuntu come \ n


1
Il compilatore aggiunge automaticamente un Environment.NewLine tra ciascuna riga del testo. Quindi la stringa viene interpretata come: "prima riga" + Environment.NewLine + "seconda riga" + Environment.NewLine + "terza riga"
Tal Jerome,

3
+1 Modo poco noto di inserire nuove righe nei letterali stringa. C'è qualche riferimento per il comportamento specificato? È davvero Environment.NewLine o è la definizione di compilatore di una nuova riga?
Smorfia di disperazione,

1
Sei sicuro che non sia il carattere newline dell'editor di codice che viene inserito lì? Se copi e incolli quel codice in un editor su Windows, probabilmente verrà convertito in \ r \ n. Fai lo stesso su una piattaforma simile a Unix e probabilmente verrà convertito in \ n.
Xiyng,

Attenzione a questo. Se esegui il checkout del codice sul server CI / CD (come Teamcity, il checkout sul lato server) cambierà CRLF in LF e non ci saranno nuove righe nella stringa.
Leszek P

13
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();

2
Perché dovresti fare questo invece di usare first + Environment.NewLine + secondquale è più efficiente e (IMO) più facile da leggere?
Jon Skeet,

@Jon: più efficiente, davvero? Ho pensato che String.Formatprodurrà 1 stringa alla volta (ma internamente è un po 'lenta a causa di concatenazioni specifiche della cultura, ecc.), Mentre la concatenazione di stringhe - 1 risultante + 1 temporanea, giusto?
abatishchev,

1
@abatishchev: il compilatore converte str + str + str in String.Concatenate, che crea direttamente solo una stringa di output (IIRC, se le stringhe sono letterali, la concatenazione viene eseguita nel compilatore.
Richard

@Richard: cioè la concatenazione di stringhe multiple ma a una riga ( "a"+b+"c"+d, ecc.) Per prestazioni sono uguali a una sola? O semplicemente convertito in String.Concatenate(a,b,c,d,etc), giusto?
abatishchev,

@abatishchev: ecco perché non ho suggerito string.Formatnel commento. La concatenazione di stringhe non produrrà stringhe temporanee, poiché il compilatore chiamerà string.Concat(first, Environment.NewLine, second).
Jon Skeet,

3

Un altro modo per posizionare comodamente Environment.NewLine in formato stringa. L'idea è quella di creare un metodo di estensione della stringa che formatta la stringa come al solito ma sostituisce anche {nl} nel testo con Environment.NewLine

uso

   " X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
   gives:
    X=1
    Y=2
    X+Y=3

Codice

    ///<summary>
    /// Use "string".FormatIt(...) instead of string.Format("string, ...)
    /// Use {nl} in text to insert Environment.NewLine 
    ///</summary>
    ///<exception cref="ArgumentNullException">If format is null</exception>
    [StringFormatMethod("format")]
    public static string FormatIt(this string format, params object[] args)
    {
        if (format == null) throw new ArgumentNullException("format");

        return string.Format(format.Replace("{nl}", Environment.NewLine), args);
    }

Nota

  1. Se vuoi che ReSharper evidenzi i tuoi parametri, aggiungi l'attributo al metodo sopra

    [StringFormatMethod ( "formato")]

  2. Questa implementazione è ovviamente meno efficiente di String.Format

  3. Forse uno, che fosse interessato a questa domanda, sarebbe interessato anche alla domanda successiva: formattazione della stringa denominata in C #


2
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

Non è quello:

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";

1
static class MyClass
{
   public const string NewLine="\n";
}

string x = "first line" + MyClass.NewLine + "second line"

3
-1: il sistema definisce già Environment.NewLine: vedere le altre risposte.
Richard,

@Richard: OP, per quanto ho potuto capirlo, vuole usare una stringa inline letterale, cioèconst string
abatishchev,

@Richard Environment.NewLine è statico non const

1

le nuove versioni .net consentono di utilizzare $ davanti al valore letterale, che consente di utilizzare le variabili all'interno come segue:

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";

1
Un po 'di contesto non sarebbe male.
croxy,

1
Questo non fornisce una risposta alla domanda. Una volta che hai una reputazione sufficiente , sarai in grado di commentare qualsiasi post ; fornire invece risposte che non richiedono chiarimenti da parte del richiedente . - Dalla recensione
H. Pauwelyn,

@ H.Pauwelyn ツ: Grazie per il feedback. Ho aggiunto un po 'di contesto. Dal mio punto di vista la soluzione risponde sicuramente alla domanda.
DanielK,

0

Se vuoi davvero la stringa New Line come costante, puoi farlo:

public readonly string myVar = Environment.NewLine;

L'utente della parola chiave readonly in C # significa che questa variabile può essere assegnata una sola volta. Puoi trovare la documentazione qui . Consente la dichiarazione di una variabile costante il cui valore non è noto fino al momento dell'esecuzione.


0

Mi piace di più il "modo pitonico"

List<string> lines = new List<string> {
    "line1",
    "line2",
    String.Format("{0} - {1} | {2}", 
        someVar,
        othervar, 
        thirdVar
    )
};

if(foo)
    lines.Add("line3");

return String.Join(Environment.NewLine, lines);

0

Se stai lavorando con un'applicazione Web puoi provare questo.

StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")

0

Se capisco la domanda: Coppia "\r\n"per ottenere quella nuova riga sotto in a textbox. Il mio esempio ha funzionato -

   string s1 = comboBox1.Text;     // s1 is the variable assigned to box 1, etc.
   string s2 = comboBox2.Text;

   string both = s1 + "\r\n" + s2;
   textBox1.Text = both;

Una risposta tipica potrebbe essere s1 s2 nello text boxstile di tipo definito usando.


-1

Qui, Environment.NewLine non ha funzionato.

Ho messo un " < br / > " in una stringa e lavorato.

Ex:

ltrYourLiteral.Text = "Prima riga. <br /> Seconda riga.";

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.