C# Language
StringBuilder
Ricerca…
Che cos'è un oggetto StringBuilder e quando usarne uno
Un StringBuilder
rappresenta una serie di caratteri, che a differenza di una stringa normale, sono mutabili. Spesso è necessario modificare le stringhe che abbiamo già creato, ma l'oggetto stringa standard non è mutabile. Ciò significa che ogni volta che una stringa viene modificata, è necessario creare un nuovo oggetto stringa, copiarlo e quindi riassegnarlo.
string myString = "Apples";
mystring += " are my favorite fruit";
Nell'esempio precedente, myString
inizialmente ha solo il valore "Apples"
. Tuttavia, quando concateniamo "è il mio frutto preferito", ciò che la classe di stringhe deve fare internamente implica:
- Creare una nuova matrice di caratteri uguale alla lunghezza di
myString
e alla nuova stringa che stiamo aggiungendo. - Copia tutti i caratteri di
myString
all'inizio del nostro nuovo array e copia la nuova stringa nella fine dell'array. - Crea un nuovo oggetto stringa in memoria e riassegnalo a
myString
.
Per una singola concatenazione, questo è relativamente banale. Tuttavia, cosa succederebbe se fosse necessario eseguire molte operazioni di accodamento, ad esempio in un ciclo?
String myString = "";
for (int i = 0; i < 10000; i++)
myString += " "; // puts 10,000 spaces into our string
A causa della copia ripetuta e della creazione di oggetti, ciò determinerà un degrado significativo delle prestazioni del nostro programma. Possiamo evitarlo usando invece un StringBuilder
.
StringBuilder myStringBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++)
myStringBuilder.Append(' ');
Ora, quando viene eseguito lo stesso ciclo, le prestazioni e la velocità del tempo di esecuzione del programma saranno significativamente più veloci rispetto all'utilizzo di una stringa normale. Per ripristinare StringBuilder
in una stringa normale, possiamo semplicemente chiamare il metodo ToString()
di StringBuilder
.
Tuttavia, questa non è l'unica ottimizzazione che StringBuilder
ha. Per ottimizzare ulteriormente le funzioni, possiamo sfruttare altre proprietà che aiutano a migliorare le prestazioni.
StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000
Se sappiamo in anticipo quanto deve essere il nostro StringBuilder
, possiamo specificare la sua dimensione in anticipo, il che impedirà di ridimensionare l'array di caratteri che ha internamente.
sb.Append('k', 2000);
Sebbene l'uso di StringBuilder
per l'aggiunta sia molto più veloce di una stringa, può essere eseguito anche più velocemente se è necessario aggiungere un singolo carattere molte volte.
Una volta completata la creazione della stringa, è possibile utilizzare il metodo ToString()
su StringBuilder
per convertirlo in una string
base. Questo è spesso necessario perché la classe StringBuilder
non eredita dalla string
.
Ad esempio, ecco come utilizzare StringBuilder
per creare una string
:
string RepeatCharacterTimes(char character, int times)
{
StringBuilder builder = new StringBuilder("");
for (int counter = 0; counter < times; counter++)
{
//Append one instance of the character to the StringBuilder.
builder.Append(character);
}
//Convert the result to string and return it.
return builder.ToString();
}
In conclusione, StringBuilder
dovrebbe essere usato al posto della stringa quando è necessario apportare molte modifiche a una stringa con le prestazioni in mente.
Utilizzare StringBuilder per creare una stringa da un numero elevato di record
public string GetCustomerNamesCsv()
{
List<CustomerData> customerDataRecords = GetCustomerData(); // Returns a large number of records, say, 10000+
StringBuilder customerNamesCsv = new StringBuilder();
foreach (CustomerData record in customerDataRecords)
{
customerNamesCsv
.Append(record.LastName)
.Append(',')
.Append(record.FirstName)
.Append(Environment.NewLine);
}
return customerNamesCsv.ToString();
}