Déclaration d'une chaîne d'une seule ligne en C#

y a-t-il une façon décente de déclarer une longue chaîne en C#, de sorte qu'il n'est pas impossible de déclarer et/ou de visualiser la chaîne dans un éditeur?

Les options, je suis conscient de sont:

1: Laisser courir. C'est mauvais parce que parce que votre chaîne de pistes loin au loin à la droite de l'écran, ce qui rend un développeur lisant le message doit faire défiler ennuyeux et lire.

string s = "this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  ";

2: @+retours à la ligne. Cela a l'air sympa dans le code, mais introduit de nouvelles lignes à la corde. En outre, si vous voulez qu'il ait l'air agréable dans le code, non seulement vous obtenez des nouvelles lignes, mais vous obtenez aussi des espaces maladroits au début de chaque ligne de la chaîne.

string s = @"this is my really long string.  this is my long string.
             this line will be indented way too much in the UI. 
This line looks silly in code.  All of them suffer from newlines in the UI.";

3: "" + ... cela fonctionne très bien, mais est très frustrant à taper. Si je dois ajouter une demi-ligne de texte quelque part, je dois mettre à jour toutes sortes de +'s et déplacer le texte tout autour.

string s = "this is my really long string.  this is my long string. " + 
           "this will actually show up properly in the UI and looks " +
           "pretty good in the editor, but is just a pain to type out " +
           "and maintain";

4: string.format or string.concat . Fondamentalement, l' même que ci-dessus, mais sans les signes plus. A les mêmes avantages et inconvénients.

N'y a-t-il vraiment aucun moyen de bien faire cela?

28
demandé sur JasonMArcher 2009-10-14 16:05:29

12 réponses

cela dépend de la façon dont la corde va finir d'être utilisée. Ici toutes les réponses sont valables, mais le contexte est important. Si la chaîne longue "s" doit être journalisée, elle doit être entourée d'un test de logging guard, comme cet exemple de Log4net:

if (log.IsDebug) {
    string s = "blah blah blah" + 
    // whatever concatenation you think looks the best can be used here,
    // since it's guarded...
}

si la chaîne longue s va être affichée à un utilisateur, alors Developer Art 'S réponse est le meilleur choix...celles-ci doivent être dans le fichier de ressources.

pour d'autres utilisations (générer des chaînes de requête SQL, écrire dans des fichiers [mais considérer les ressources à nouveau pour ceux-ci], etc...), où vous concaténez plus que de simples littérales, considérez StringBuilder comme Wael Dalloul suggère, surtout si votre chaîne pourrait éventuellement finir dans une fonction qui pourrait juste, à une certaine date dans un futur lointain, être appelé de nombreuses fois dans une application Time-critical (toutes ces invocations s'additionnent). Je le fais, par exemple, lors de la construction d'une requête SQL où J'ai des paramètres qui sont des variables.

à part ça, Non, Je ne sais rien qui soit à la fois joli et facile à taper (bien que le mot wrap suggestion soit une bonne idée, il se peut qu'il ne se traduise pas bien à des outils diff, des sorties d'impression de code, ou des outils de révision de code). Ce sont les pauses. (J'utilise personnellement l'approche plus-signe pour rendre les enveloppes de ligne soignées pour nos sorties d'impression et les critiques de code).

7
répondu Ogre Psalm33 2009-10-27 17:49:34

il y a un moyen. Mettez votre très longue corde dans les ressources. Vous pouvez même y mettre de longs textes parce que c'est là que les textes devraient être. Les avoir directement en code est une très mauvaise pratique.

60
répondu 2009-10-14 12:07:13

si vous utilisez Visual Studio""

Tools > Options > Text Editor > All Languages > Word Wrap

je suis sûr que n'importe quel autre éditeur de texte (y compris notepad) sera capable de le faire!

8
répondu stevehipwell 2009-10-14 12:09:31

doit-il être défini dans le fichier source? Sinon, définissez-le dans une ressource ou un fichier de configuration.

6
répondu d91-jal 2009-10-14 12:12:33

vous pouvez utiliser StringBuilder comme ceci:

StringBuilder str = new StringBuilder();
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
string s = str.ToString();

vous pouvez également utiliser: fichiers texte, Fichier ressource, base de données et Registre.

5
répondu Wael Dalloul 2009-10-14 12:12:50

si vous really voulez cette longue chaîne dans le code, et vous ne voulez vraiment pas taper la fin-quote-plus-begin-quote, alors vous pouvez essayer quelque chose comme ça.

string longString = @"Some long string, 
    with multiple whitespace characters 
    (including newlines and carriage returns)
    converted to a single space
    by a regular expression replace.";

longString = Regex.Replace(longString, @"\s+", " ");
5
répondu John Fisher 2009-10-21 02:58:18

personnellement, je voudrais lire une chaîne de caractères aussi grande à partir d'un fichier peut-être un document XML.

3
répondu James 2009-10-14 12:26:24

pour des chaînes très longues, je le stockerais en XML (ou dans une ressource). Pour les occasions où il est logique de l'avoir dans le code, j'utilise la concaténation de chaîne multiligne avec l'opérateur + . Le seul endroit où je peux penser à l'endroit où je le fais, cependant, est dans mon unité de tests pour le code qui lit et analyse XML où je suis réellement en train d'essayer d'éviter d'utiliser un fichier XML pour les tests. Puisque c'est un test unitaire, je veux presque toujours avoir la chaîne juste là pour faire référence aussi bien. Dans ces cas je pourrais séparer le tout dans une directive #region donc je peux afficher/masquer.

2
répondu tvanfosson 2009-10-14 12:40:15

vous pouvez utiliser StringBuilder

1
répondu Jimmeh 2009-10-14 12:08:40

soit je le laisse tourner, soit j'utilise string.formater et écrire la chaîne dans une ligne (la méthode let it run) mais mettre chacun des arguments dans une nouvelle ligne, ce qui le rend soit plus facile à lire, ou au moins donner au lecteur une idée de ce qu'il peut attendre dans la longue chaîne sans le lire en détail.

0
répondu David Božjak 2009-10-14 12:11:52

si vous aviez vraiment besoin de le garder dans le code alors que diriez-vous de @+newlines et puis une fonction simple pour enlever les newlines.

0
répondu Hassan Voyeau 2009-10-14 13:41:04

utilisez le Project / Properties / Settings dans le menu supérieur de Visual Studio. Faites le scope = "Application" .

dans la boîte de valeur vous pouvez entrer de très longues chaînes et comme un flux de ligne de bonus sont préservés. Alors votre code peut renvoyer à cette chaîne comme ceci:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

0
répondu Max Drawbaugh 2018-03-09 17:55:59