web-dev-qa-db-fra.com

Déclarer une looooong chaîne simple en C #

Existe-t-il un moyen décent de déclarer une chaîne longue unique en C #, de sorte qu'il n'est pas impossible de déclarer et/ou d'afficher la chaîne dans un éditeur?

Les options que je connais sont les suivantes:

1: Laisse-le courir. C’est mauvais parce que votre chaîne traîne loin à droite de l’écran, ce qui oblige un développeur qui lit le message à faire défiler et à lire ennuyeux.

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: @ + nouvelles lignes. Cela ressemble à Nice dans le code, mais introduit des nouvelles lignes à la chaîne. De plus, si vous voulez que le code ait une apparence agréable, non seulement vous obtenez des nouvelles lignes, mais vous obtenez également des espaces délicats 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 bien, mais la saisie est très frustrante. Si j'ai besoin d'ajouter du texte d'une demi-ligne quelque part, je dois mettre à jour toutes sortes de + 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 les mêmes 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 le faire bien?

28
Cory

Cela dépend de la manière dont la chaîne va être utilisée. Toutes les réponses ici sont valables, mais le contexte est important. Si la longue chaîne "s" doit être enregistrée, elle doit être entourée d'un test de protection de la journalisation, tel que cet exemple 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 doit être affichée à un utilisateur, la réponse de Developer Art est le meilleur choix ... celles-ci doivent figurer dans le fichier de ressources.

Pour d'autres utilisations (génération de chaînes de requête SQL, écriture dans des fichiers [mais considérez à nouveau les ressources pour celles-ci], etc ...), où vous concatérez plus que des littéraux, considérez StringBuilder comme Wael Dalloul suggère, en particulier si votre chaîne pourrait éventuellement se retrouver dans une fonction qui pourrait, à une date ultérieure, être appelée de nombreuses fois dans une application critique (toutes ces invocations s'additionnent). Je le fais, par exemple, lors de la création d'une requête SQL dans laquelle j'ai des paramètres qui sont des variables. 

Autre que cela, non, je ne connais rien qui soit joli et facile à taper (bien que la suggestion d'habillage Word soit une bonne idée, elle risque de ne pas bien se traduire par des outils diff, des impressions de code ou des outils de révision de code ). Ce sont les pauses. (J'utilise personnellement l'approche du signe plus pour rendre les retours à la ligne nets pour nos impressions imprimées et nos critiques de code).

7
Ogre Psalm33

Il y a un moyen. Mettez votre très longue chaîne en ressources. Vous pouvez même y placer de longs morceaux de texte car c'est là que les textes devraient être. Les avoir directement dans le code est une très mauvaise pratique.

61
user151323

Si vous utilisez Visual Studio

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

Je suis sûr que tout autre éditeur de texte (y compris le bloc-notes) pourra le faire!

8
stevehipwell

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

6
d91-jal

Si vous vraiment voulez cette longue chaîne dans le code et que vous ne voulez vraiment pas taper le mot-clé end-quote-plus-begin-quote, vous pouvez essayer quelque chose comme ceci.

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
John Fisher

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 de ressources, base de données et registre.

5
Wael Dalloul

Personnellement, je lirais une chaîne aussi grosse d'un fichier, peut-être un document XML.

3
James

Pour de très longues chaînes, je le stockais en XML (ou une ressource). Pour les occasions où il est judicieux de l'inclure dans le code, j'utilise la concaténation de chaînes multilignes avec l'opérateur +. Le seul endroit où je peux faire cela, cependant, est dans mes tests unitaires pour le code qui lit et analyse XML, où j'essaie en fait d'éviter d'utiliser un fichier XML pour les tests. Puisqu'il s'agit d'un test unitaire, je veux presque toujours avoir la chaîne à laquelle faire référence. Dans ces cas, je pourrais les séparer tous dans une directive #region afin de pouvoir l'afficher/la masquer au besoin.

2
tvanfosson

Vous pouvez utiliser StringBuilder

1
Jimmeh

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

Dans la zone Valeur, vous pouvez saisir de très longues chaînes et, en tant que bonus, les sauts de ligne sont préservés. Ensuite, votre code peut faire référence à cette chaîne comme ceci: 

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

0
Max Drawbaugh

si vous aviez vraiment besoin de le garder dans le code, pourquoi ne pas utiliser @ + newlines, puis une fonction simple pour supprimer les nouvelles lignes.

0
Hassan Voyeau

Soit je le laisse fonctionner, soit j'utilise string.format et j'écris la chaîne sur une seule ligne (la méthode let it run), mais je place chacun des arguments dans une nouvelle ligne, ce qui facilite la lecture ou donne au moins au lecteur une idée de ce à quoi il peut s’attendre dans la longue chaîne sans la lire en détail.

0
David Božjak