177 votes

Comment insérer une nouvelle ligne dans une chaîne littérale ?

En .NET, je peux fournir à la fois \r ou \n littéraux de chaîne, mais il existe un moyen d'insérer quelque chose comme un caractère spécial "nouvelle ligne" comme Environment.NewLine propriété statique ?

9 votes

Quelle est la question ?

348voto

Jon Skeet Points 692016

Eh bien, les options simples sont :

  • string.Format :

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • Concaténation de chaînes de caractères :

    string x = "first line" + Environment.NewLine + "second line";
  • Interpolation des chaînes de caractères (en C#6 et plus) :

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

Vous pouvez également utiliser \n partout, et remplacer :

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

Notez que vous ne pouvez pas en faire une chaîne de caractères. constant car la valeur de Environment.NewLine ne sera disponible qu'au moment de l'exécution.

1 votes

Merci, bien sûr, mais je voulais éviter d'utiliser Environment.NewLine, ma question étant de savoir s'il existe un littéral '/newline'.

3 votes

@Capitaine : Pourquoi voulez-vous éviter Environment.NewLine ? Au contraire, c'est une bonne pratique de l'utiliser.

21 votes

@abatishchev : En un peu de Dans certains endroits, c'est une bonne pratique. Dans d'autres, ce n'est pas le cas. Vous devez vraiment savoir que vous voulez utiliser celle qui est spécifique à la plate-forme. Par exemple, il n'est pas une bonne idée si vous utilisez un protocole réseau qui doit définir lui-même les terminaisons de ligne.

35voto

Tal Jerome Points 121

Si vous voulez une chaîne const qui contient Environment.NewLine, vous pouvez faire quelque chose comme ceci :

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

EDIT

Comme il s'agit d'une chaîne const, cela se fait au moment de la compilation et c'est donc l'interprétation d'une nouvelle ligne par le compilateur. Je n'arrive pas à trouver une référence expliquant ce comportement mais je peux prouver qu'il fonctionne comme prévu. J'ai compilé ce code à la fois sur Windows et Ubuntu (avec Mono) puis désassemblé et voici les résultats :

Disassemble on WindowsDisassemble on Ubuntu

Comme vous pouvez le constater, dans Windows, les nouvelles lignes sont interprétées comme suit \r\n et sur Ubuntu comme \n

1 votes

Le compilateur ajoute automatiquement un Environment.NewLine entre chaque ligne du texte. Ainsi, la chaîne est interprétée comme suit : "première ligne" + Environment.NewLine + "deuxième ligne" + Environment.NewLine + "troisième ligne".

3 votes

+1 Méthode peu connue d'insertion de nouvelles lignes dans les chaînes de caractères. Existe-t-il une référence pour le comportement que vous spécifiez ? S'agit-il vraiment de Environment.NewLine ou de la définition d'une nouvelle ligne par le compilateur ?

1 votes

Êtes-vous sûr que ce n'est pas le caractère de nouvelle ligne de l'éditeur de code qui est inséré à cet endroit ? Si vous copiez-coller ce code dans un éditeur sous Windows, il sera probablement converti en \r\n. Faites la même chose sur une plateforme de type Unix et vous serez probablement converti en \n à la place.

14voto

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

2 votes

Pourquoi faire cela plutôt que d'utiliser first + Environment.NewLine + second qui est plus efficace et (IMO) plus facile à lire ?

0 votes

@Jon : Plus efficace, vraiment ? Je pensais que String.Format produira 1 chaîne à la fois (mais c'est en interne un peu lent à cause des concaténations spécifiques à la culture, etc), alors que la concaténation de chaînes - 1 résultant + 1 temporaire, n'est-ce pas ?

1 votes

@abatishchev : le compilateur convertit str+str+str en String.Concatenate qui construit directement une seule chaîne de sortie (IIRC, si les chaînes sont des littéraux, la concaténation est faite dans le compilateur.

3voto

MajesticRa Points 2244

Une autre façon de placer facilement Environment.NewLine dans la chaîne de format. L'idée est de créer une méthode d'extension de chaîne de caractères qui formate la chaîne comme d'habitude, mais qui remplace également {nl} dans le texte par Environment.NewLine.

Utilisation

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

Code

    ///<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);
    }

Note

  1. Si vous voulez que ReSharper mette en évidence vos paramètres, ajoutez un attribut à la méthode ci-dessus

    [StringFormatMethod("format")]

  2. Cette implémentation est évidemment moins efficace que String.Format.

  3. Peut-être que celui qui s'est intéressé à cette question s'intéressera aussi à la question suivante : Formatage des chaînes nommées en C#

3voto

Hakkı Eser Points 1
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

ce n'est pas ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X