En C#, Quel est le meilleur moyen de répartir un littéral de chaîne à une seule ligne sur plusieurs lignes source?

Supposons que vous ayez une longue chaîne (>80 caractères) que vous souhaitez répartir sur plusieurs lignes source, mais que vous ne souhaitez pas inclure de caractères de nouvelle ligne.

Une option consiste à concaténer des sous-chaînes:

string longString = "Lorem ipsum dolor sit amet, consectetur adipisicing" +
    " elit, sed do eiusmod tempor incididunt ut labore et dolore magna" +
    " aliqua. Ut enim ad minim veniam";

Y a-t-il un meilleur moyen, ou est-ce la meilleure option?

Edit: par "meilleur", je veux dire plus facile pour le codeur à lire, écrire et éditer. Par exemple, si vous avez fait {[10] } voulez des nouvelles lignes, il est très facile de regarder:

string longString =
@"Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam";

Je me demande s'il y a quelque chose d'aussi propre lorsque vous ne voulez pas de nouvelles lignes.

30
demandé sur Matthew 2010-01-02 05:30:33

7 réponses

J'utiliserais une variante de votre méthode:

string longString =
    "Lorem ipsum dolor sit amet, consectetur adipisicing " + 
    "elit, sed do eiusmod tempor incididunt ut labore et dolore magna " + 
    "aliqua. Ut enim ad minim veniam.";

Ici, je commence la chaîne sur la ligne après le signe égal afin qu'ils s'alignent tous, et je m'assure également que l'espace se produit à la fin de la ligne (encore une fois, à des fins d'alignement).

50
répondu bobbymcr 2010-01-02 02:38:19

Si vous voulez garder le code aussi minime que possible et être capable de le lire facilement, j'irais toujours avec une chaîne @ literal. Plus son plus rapide si vous source est longue et..

string verbatimLit = @" 
   __   __  
  /  `-'  \ 
 /_| N   |_\  Sometimes
   |  I  |    format in code
   |   N |    matters
   |_____|  
";

Ensuite, supprimez les nouvelles lignes de la chaîne dans 1 Ligne,

verbatimLit.Replace(Environment.NewLine, " ");
28
répondu Tj Kellie 2014-01-28 19:46:49

Votre idée originale est probablement le moyen le plus simple d'avoir une chaîne littérale intégrée dans votre code. le compilateur C# fusionne les littéraux concaténés avec + - donc, c'est essentiellement équivalent à une seule chaîne très longue.

Une autre option, bien sûr, consiste à externaliser la chaîne dans un fichier de configuration ou un fichier de paramètres. Cela lui permettrait d'être à la fois plus lisible et plus facile à modifier ou à localiser. Personnellement, j'évite de placer directement de longues lignes de texte dans le code d'une application, sauf s'ils sont très statiques et n'ont pas besoin de localisation - texte de message d'exception interne, etc.

10
répondu LBushkin 2010-01-02 02:41:09

Pour les requêtes SQL ou d'autres chaînes longues qui ont leur propre syntaxe, je vais parfois faire quelque chose comme ceci:

        private const string QUERY = @"
SELECT *
FROM Table1 AS T1
INNER JOIN Table2 AS T2 ON T1.ID = T2.T1ID
WHERE T1.VALUE = @P1
GROUP BY T2.OTHERVALUE
";

Le formatage de la chaîne reste intact.

7
répondu John Saunders 2010-01-02 03:29:29

Suivant la réponse Tj Kellie, en C # 6.0, vous pouvez facilement avoir une instruction pour effectuer la concaténation et l'incorporation de diverses informations par interpolation de chaîne et ne pas avoir de nouvelles lignes malgré la définition de la chaîne sur plusieurs lignes.

Un exemple complexe impliquant tous ces éléments peut ressembler à ce qui suit:

public int? BestTime { get; set; }
public int? WorstTime { get; set; }
public int? AvgTime { get; set; }
public int TimeoutReachedCount { get; set; }
public int AllRunCount { get; set; }

public string Str => $@"
   Ran {AllRunCount} times; 
   Reached timeout {TimeoutReachedCount} times; 
   Best time = {(BestTime.HasValue ? BestTime.ToString() : "N/A")}; 
   Worst time = {(WorstTime.HasValue ? WorstTime.ToString() : "N/A")}; 
   Average time = {(AvgTime.HasValue ? AvgTime.ToString() :"N/A")};"
       .Replace(Environment.NewLine, "");

Bien sûr, il faut ajouter des blancs à la fin des lignes pour éviter la fusion des mots.

1
répondu Alexei 2017-03-14 17:00:31

Lorsque vous vous trouvez en question sur la façon de faire des chaînes multilignes, vous pourriez être préférable d'utiliser un fichier de ressources.

0
répondu Johannes Rudolph 2010-01-02 03:34:08

Vous pouvez utiliser plusieurs consts, puis les combiner en une grande chaîne:

const string part1 = "part 1";
const string part2 = "part 2";
const string part3 = "part 3";
string bigString = part1 + part2 + part3;

Le compilateur "pliera" ces constantes en une grosse chaîne de toute façon, donc il n'y a aucun coût d'exécution à cette technique par rapport à votre exemple de code original.

, Il existe un certain nombre d'avantages à cette approche:

  1. les sous-chaînes peuvent être facilement réutilisées dans d'autres parties de l'application.
  2. les sous-chaînes peuvent être définies dans plusieurs fichiers ou types, si voulu.
-2
répondu Eilon 2010-01-02 02:44:51