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();
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow