La classe System.Text.StringBuilder.StringBuilder non è potente come la classe String in termini di metodi supportati. L' elaborazione che si può fare in uno StringBuilder è limitata a sostituzioni, aggiunte o rimozioni di testo dalla stringa. Comunque lavora in modo più efficiente.

Quando si costruisce una stringa con la classe String, viene allocata solamente la memoria necessaria a contenere la stringa. La StringBuilder, tuttavia, normalmente alloca più memoria di quanta ce ne sia bisogno. Lo sviluppatore, ha l' opzione di indicare quanta memoria deve essere allocata allo StringBuilder, ma se non lo si facesse, la quantità di memoria verrà decisa dipendentemente dalla lunghezza della stringacon cui l' istanza di StringBuilder viene inizializzata. La classe StringBuilder ha due proprietà principali:

 

_ Length, che indica la reale lunghezza della stringa che contiene

_ Capacity, che indica la lunghezza massimadella stringanell' allocazione di memoria.

 

Ogni modifica della stringa avviene all'interno del blocco di memoria assegnato all'istanza di StringBuilder, che rende l'aggiunta di sottostringhe e la sostituzione di singoli caratteri all' interno distringhe molto efficiente. Rimuovere o inserire è inevitabilmente ancora povero in prestazioni, perchè significa che tutta la parte rimanente della stringa deve essere spostata. Solamenta se si effettua qualche operazione che supera la capacità della stringa, sarà necessario allocare altra memoria e possibilmente spostare tutta la stringa contenuta. Per ampliare la propria capacità lo SringBuilder raddoppia la misura, in caso individui l'eccesso e nessun nuovo valore di capacità sia stato imposto.

Per esempio, se si usa un oggetto StringBuilder per costruire un messaggio, si può scrivere questo codice:

 

StringBuilder messaggio = new StringBuilder("Non esistono donne brutte", 90);

messaggio.AppendFormat(", ma solo " + "donne pigre");

 

Per utilizzare la classe StringBuilder, bisogna avere un riferimento a System.Text nel proprio codice.

 

Questo codice imposta una capacità iniziale di 90 per lo StringBuilder. È sempre meglio specificare una capacità che copra in eccesso la massima lunghezza prevista dalla stringa, per assicurarsi che lo StringBuilder non debba riallocare per il superamento della sua capacità. Teoricamente si può impostare una capacità con un numero grande quanto un int, anche se probabilmente il sistema lamenterebbe il fatto che non ha abbastanza memoria per allocare un massimo di 2 miliardi di caratteri.

Quando il codice precedente viene eseguito per prima cosa crea un oggetto StringBuilder come in figura:

 

Non esistono donne brutte       

                <non inizializzato>                   

           <------------- 25 caratteri ---------------><---------------------- 65 caratteri ----------------------> 

 

Dopodiché, chiamando il metodo AppendFormat(), il testo rimanente viene aggiunto allo spazio vuoto senza bisogno di altra allocazione di memoria. Comunque sia, il vero guadagno in efficienza nell'uso di uno StringBuilder, lo si ha quando si fanno sostituzioni di testo ripetutamente. Ecco un esempio di cifratura:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cifratura
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Cifraturan");
            StringBuilder messaggio = new StringBuilder("Non esistono donne brutte", 90);
            messaggio.AppendFormat(", ma solo " + "donne pigre");
            Console.WriteLine("Messaggio originale:n{0}", messaggio);
            char old1, new1;
            for (int i = 'z'; i >= 'a'; i--)
            {
                old1 = (char)i;
                new1=(char)(i+1);
                messaggio.Replace(old1, new1);
            }
            for (int i = 'Z'; i >= 'A'; i--)
            {
                old1 = (char)i;
                new1 = (char)(i + 1);
                messaggio.Replace(old1, new1);
            }
            Console.WriteLine("Messaggio cifrato:n{0}", messaggio);
            Console.Write("nnFine... ");
            Console.ReadKey();
        }
    }
}

 

 

Questo codice utilizza il metodo StringBuilder.replace() che fa la stessa cosa di String.Replace(), senza però copiare le stringhe durante l' elaborazione. La memoria allocata per le stringhe, in totale risulta essere di 150 caratteri per l' istanza StringBuilder, ed altrettanta allocata durante le operazioni con le stringhe effettuate internamente dall'istruzione Console.WriteLine() finale.

Normalmente, si utilizza StringBuilder per effettuare qualsiasi manipolazione di stringhe e poi String per immagazzinare e stampare il risultato finale.

 

I membri di StringBuilder

 

Si è visto una dimostrazione di un costruttore di StringBuilder che prende come parametri una stringa iniziale e la capacita totale. Oltre a questo esistono altri tipi di costruttori. Ad esempio è possibile passare solo una stringa:

 

StringBuilder sb = new StringBuilder( "Ciao" );

 

Oppure uno StringBuilder con una capacita precisa:

 

StringBuilder sb = new StringBuilder(20);

 

Oltre a Length e Capacity, c'è un'altra proprietà read-only chiamata MaxCapacity che indica il limite fino al quale un' istanza StringBuilder può crescere. Di default, questo si ricava da int.MaxValue ( approssimativamente 2 miliardi, come detto prima ) , ma si può impostare ad un valore minore quando si istanzia l'oggetto StringBuilder:

 

StringBuilder sb = new StringBuilder(20, 500);

 

Si può impostare esplicitamente la capacità in qualsiasi momento, ed un'eccezione verrà sollevata nel caso si provi ad impostare una capacità inferiore alla lunghezza della stringa contenuta o maggiore del limite massimo di capacità:

 

StringBuilder sb = new StringBuilder( "Ciao" );

sb.Capacyty = 100;

 

La seguente tabella mostra i principali metodi di StringBuilder:

Metodo:              Utilita

Append()  Aggiunge un'altra stringa alla stringa corrente. 
AppendFormat()      Aggiunge una stringa che è stata elaborata da uno specificatore di formattazione.
Insert() Inserisce una sotto-stringa nella stringa corrente.
Remuve() Rimuove i caratteri dalla stringa corrente.
ToSring() Sostituisce tutte le ricorrenze di un carattere con un altro carattere o di una sotto-stringa con un'altra sotto-stringa.

Molti di questi metodi hanno alcuni overload.

Non vi è nessun cast ( ne implicito né esplicito ) da StringBuilder a String. Se si vuole avere in output il contenuto di uno StringBuilder come una string, si deve usare il metodo ToString().

 

Ora che si è introdotta la classe StringBuilder e che sono stati appresi alcuni metodi con i quali si possono aumentare le prestazioni, bisogna riconoscere che questa classe non darà sempre l'aumento in performance di cui si ha bisogno. Di base, la classe StringBuilder dovrebbe essere usata quando si manipolano più stringhe. Comunque, se si deve fare qualcosa di semplice come concatenare due stringhe, si otterranno prestazioni migliori con System.String.