Procedura: concatenare più stringhe (Guida per programmatori C#)
La concatenazione è il processo di aggiunta di una stringa alla fine di un'altra stringa.Quando si concatenano valori letterali stringa o costanti di tipo stringa tramite l'operatore +, il compilatore crea una singola stringa.Non si verifica alcuna concatenazione in fase di esecuzione.Tuttavia, le variabili di tipo stringa possono essere concatenate solo in fase di esecuzione.In questo caso, è necessario capire gli effetti dei vari approcci sulle prestazioni.
Esempio
Nell'esempio seguente viene mostrato come suddividere un lungo valore letterale stringa in stringhe più piccole, per migliorare la leggibilità nel codice sorgente.Queste parti verranno concatenate in una singola stringa in fase di compilazione.Non vi è alcun impatto sulle prestazioni in fase di esecuzione indipendentemente dal numero di stringhe coinvolte.
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);
}
Per concatenare variabili di tipo stringa, è possibile utilizzare gli operatori + o += o i metodi String.Concat, String.Format o StringBuilder.Append.L'operatore + è facile da utilizzare e rende il codice intuitivo.Anche se si utilizzano vari operatori + in un'istruzione, il contenuto della stringa viene copiato solo una volta.Ma se questa operazione viene ripetuta più volte, ad esempio in un ciclo, potrebbe causare problemi di efficienza.Notare, ad esempio, il codice seguente:
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.
//
[!NOTA]
Nelle operazioni di concatenazione di stringhe il compilatore C# tratta una stringa null come se fosse una stringa vuota, ma non converte il valore della stringa null originale.
Se non si deve concatenare un elevato numero di stringhe (ad esempio, in un ciclo), il costo in termini di prestazioni di questo codice è probabilmente poco rilevante.La stessa considerazione vale anche per i metodi String.Concat e String.Format.
Tuttavia, quando le prestazioni sono importanti, è sempre opportuno utilizzare la classe StringBuilder per concatenare stringhe.Nell'esempio di codice riportato di seguito viene utilizzato il metodo Append della classe StringBuilder per concatenare le stringhe senza l'effetto di concatenazione dell'operatore +.
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
// ...
//