Costruttore di stringhe

Costruttore di stringhe

# Cos'è uno StringBuilder e quando usarlo

Un StringBuilder rappresenta una serie di caratteri, che a differenza di una normale stringa, sono mutevoli. Spesso è necessario modificare le stringhe che abbiamo già creato, ma l'oggetto stringa standard non è modificabile. Ciò significa che ogni volta che una stringa viene modificata, è necessario creare, copiare e riassegnare un nuovo oggetto stringa.

string myString = "Apples";
mystring += " are my favorite fruit";

Nell'esempio sopra, myString inizialmente ha solo il valore "Apples" . Tuttavia, quando concateniamo `" sono il mio frutto preferito"', ciò che la classe string deve fare internamente implica:

  • Creazione di un nuovo array di caratteri pari alla lunghezza di myString e la nuova stringa che stiamo aggiungendo.
  • Copiare tutti i caratteri di myString all'inizio del nostro nuovo array e copiando la nuova stringa alla fine dell'array.
  • Crea un nuovo oggetto stringa in memoria e riassegnalo a myString .

Per una singola concatenazione, questo è relativamente banale. Tuttavia, cosa succede se necessario per eseguire molte operazioni di aggiunta, diciamo, 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ò comporterà 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 notevolmente più veloci rispetto all'utilizzo di una stringa normale. Per creare il StringBuilder di nuovo in una stringa normale, possiamo semplicemente chiamare ToString() metodo di StringBuilder .

Tuttavia, questa non è l'unica ottimizzazione 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 per quanto tempo il nostro StringBuilder deve essere, possiamo specificarne le dimensioni in anticipo, il che gli impedirà di dover ridimensionare l'array di caratteri che ha internamente.

sb.Append('k', 2000);

Pur utilizzando StringBuilder poiché l'aggiunta è molto più veloce di una stringa, può essere eseguita ancora più velocemente se devi solo aggiungere un singolo carattere più volte.

Una volta completata la creazione della stringa, puoi utilizzare il ToString() metodo sul StringBuilder per convertirlo in un string di base . Questo è spesso necessario perché il StringBuilder la classe non eredita da string .

Ad esempio, ecco come utilizzare un StringBuilder per creare un 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 utilizzato al posto della stringa quando è necessario apportare molte modifiche a una stringa tenendo conto delle prestazioni.

# Usa StringBuilder per creare stringhe da un gran numero 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();
}


No