Comment : concaténer plusieurs chaînes (Guide de programmation C#)
La concaténation consiste à ajouter une chaîne à la fin d'une autre chaîne.Lorsque vous concaténez des littéraux de chaîne ou des constantes de chaîne en utilisant l'opérateur +, le compilateur crée une chaîne unique.Aucune concaténation d'exécution ne se produit.Toutefois, les variables chaîne peuvent être concaténées uniquement au moment de l'exécution.Dans ce contexte, vous devez comprendre l'impact des diverses approches sur les performances.
Exemple
L'exemple suivant indique comment fractionner un long littéral de chaîne en plus petites chaînes pour améliorer la lisibilité du code source.Les diverses parties seront concaténées en une chaîne unique lors de la compilation.Il n'y a aucune incidence sur les performances d'exécution, quel que soit le nombre de chaînes impliquées.
static void Main()
{
// Concatenation of literals is performed at compile time, not run time.
string text = "Historically, the world of data and the world of objects " +
"have not been well integrated. Programmers work in C# or Visual Basic " +
"and also in SQL or XQuery. On the one side are concepts such as classes, " +
"objects, fields, inheritance, and .NET Framework APIs. On the other side " +
"are tables, columns, rows, nodes, and separate languages for dealing with " +
"them. Data types often require translation between the two worlds; there are " +
"different standard functions. Because the object world has no notion of query, a " +
"query can only be represented as a string without compile-time type checking or " +
"IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " +
"objects in memory is often tedious and error-prone.";
Console.WriteLine(text);
}
Pour concaténer des variables chaîne, vous pouvez utiliser l'opérateur + ou += ou la méthode String.Concat, String.Format ou StringBuilder.Append.L'opérateur + est facile à utiliser et convient au code intuitif.Même si vous utilisez plusieurs opérateurs + dans une instruction, le contenu de la chaîne est copié une seule fois.Mais si vous répétez plusieurs fois cette opération, par exemple dans une boucle, des problèmes de performance peuvent se poser.Observez par exemple le code suivant :
static void Main(string[] args)
{
// To run this program, provide a command line string.
// In Visual Studio, see Project > Properties > Debug.
string userName = args[0];
string date = DateTime.Today.ToShortDateString();
// Use the + and += operators for one-time concatenations.
string str = "Hello " + userName + ". Today is " + date + ".";
System.Console.WriteLine(str);
str += " How are you today?";
System.Console.WriteLine(str);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
// Example output:
// Hello Alexander. Today is 1/22/2008.
// Hello Alexander. Today is 1/22/2008. How are you today?
// Press any key to exit.
//
[!REMARQUE]
Dans les opérations de concaténation de chaîne, le compilateur C# traite une chaîne null de la même manière qu'une chaîne vide mais il ne convertit pas la valeur de la chaîne null d'origine.
Si vous ne concaténez pas un grand nombre de chaînes (par exemple, dans une boucle), l'incidence sur les performances de ce code ne sera probablement pas significatif.Cette remarque s'applique également aux méthodes String.Concat et String.Format.
Toutefois, si les performances sont une considération importante, vous devez toujours utiliser la classe StringBuilder pour concaténer des chaînes.Le code suivant utilise la méthode Append de la classe StringBuilder pour concaténer des chaînes sans l'effet de chaînage de l'opérateur +.
class StringBuilderTest
{
static void Main()
{
string text = null;
// Use StringBuilder for concatenation in tight loops.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < 100; i++)
{
sb.AppendLine(i.ToString());
}
System.Console.WriteLine(sb.ToString());
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
// Output:
// 0
// 1
// 2
// 3
// 4
// ...
//