web-dev-qa-db-fra.com

Meilleure façon de chaînes longues dans le code source C #

Je me demande quelle est la "meilleure pratique" pour casser de longues chaînes dans le code source C #. Est-ce que cette ficelle 

"string1"+
"string2"+
"string3"

concaténé lors de la compilation ou de l'exécution?

35

C'est fait au moment de la compilation. C'est exactement équivalent à "string1string2string3".

Supposons que vous ayez:

string x = "string1string2string3"
string y = "string1" + "string2" + "string3"

Le compilateur effectuera l'internat approprié de manière à ce que x et y fassent référence aux mêmes objets.

EDIT: On parle beaucoup de StringBuilder dans les réponses et les commentaires. De nombreux développeurs semblent croire que la concaténation de chaînes devrait always se faire avec StringBuilder. C’est une généralisation excessive - cela vaut la peine de comprendre pourquoi StringBuilder est bon dans certaines situations et pas dans d’autres .

49
Jon Skeet

Si les espaces ne sont pas importants, vous pouvez utiliser le caractère @ escape pour écrire des chaînes multilignes dans votre code. Ceci est utile si vous avez une requête dans votre code par exemple:

string query = @"SELECT whatever
FROM tableName
WHERE column = 1";

Cela vous donnera une chaîne avec des sauts de ligne et des tabulations, mais pour une requête, cela n'a pas d'importance.

39
Rune Grimstad

Votre exemple sera concaténé à la compilation. Toutes les chaînes en ligne et les variables de chaîne const sont concaténées au moment de la compilation.

Il convient de garder à l'esprit que l'inclusion de toutes les chaînes en lecture seule retardera la concaténation au moment de l'exécution. string.Empty et Environment.NewLine sont tous deux des variables chaîne en lecture seule.

7
James Newton-King

La concaténation est effectuée au moment de la compilation, il n'y a donc pas de surcharge de temps d'exécution.

3
Maxam

cela dépend vraiment de ce dont vous avez besoin. Généralement, si vous devez concaténer des chaînes, les meilleures performances d'exécution seront obtenues à l'aide de StringBuilder. Si vous faites référence dans le code source à quelque chose comme var str = "String1" + "String2", ce sera convertisseur. dans la chaîne str = "String1String2" lors de la compilation. Dans ce cas, vous n'avez pas de frais généraux de concaténation

1
Tamir

StringBuilder est un bon moyen d'aller si Vous avez plusieurs chaînes (plus d'environ quatre) À concaténer. C'est plus rapide.

L'utilisation de String.Concat dans l'exemple ci-dessus est effectuée au moment de la compilation. S'agissant de chaînes littérales, elles sont optimisées par le compilateur.

Si vous utilisez cependant des variables:

string a = "string1";
string b = "string2";
string c = a + b;

Ceci est fait au moment de l'exécution.

1

Ne pouvez-vous pas utiliser un StringBuilder

0
Damien

Que diriez-vous de la méthode méthode d'extension } suivante _ (inspirée de la méthode des balises communes oneLine ) ...

using System;
using System.Text.RegularExpressions;
using static System.Text.RegularExpressions.RegexOptions;

namespace My.Name.Space
{
    public static class StringHelper
    {
        public static string AsOneLine(this string text, string separator = " ")
        {
            return new Regex(@"(?:\n(?:\s*))+").Replace(text, separator).Trim();
        }
    }
}

... en combinaison avec le littéral textuel utilisé comme tel:

var mySingleLineText = @"
    If we wish to count lines of code, we should not regard them
    as 'lines produced' but as 'lines spent'.
".AsOneLine();

Notez que les espaces "à l'intérieur" de la chaîne sont conservés tels que:

// foo      bar hello        world.
var mySingleLineText = @"
    foo      bar
    hello        world.
".AsOneLine();

Si vous ne voulez pas que les nouvelles lignes soient remplacées par des espaces, passez alors "" en tant qu'argument à la méthode d'extension:

// foobar
var mySingleLineText = @"
    foo
    bar
".AsOneLine("");

Remarque: Cette forme de concaténation de chaîne est effectuée à l'exécution en raison de la méthode d'assistance impliquée (contrairement à la concaténation via l'opérateur + se produisant au moment de la compilation, comme indiqué également dans la réponse acceptée). Donc, si les performances sont un problème, utilisez le +. Si vous utilisez des phrases longues et que vous vous concentrez sur la lisibilité et la "facilité d'utilisation", alors l'approche suggérée ci-dessus peut être utile.

0
B12Toaster

Il n’ya aucun moyen de le faire. Mon préféré utilise une méthode de chaîne de C #. Exemple un:

chaîne s = chaîne.Format ("{0} {1} {0}", "Bonjour", "Par"); résultat est s = "Bonjour par Bonjour";

0
Eduardo