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?
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 .
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.
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.
La concaténation est effectuée au moment de la compilation, il n'y a donc pas de surcharge de temps d'exécution.
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
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.
Ne pouvez-vous pas utiliser un StringBuilder
?
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.
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";