Le stringhe (String) in Visual Basic .NET sono immutabili (immutable). Qualsiasi operazione, ad esempio, la concatenazione, porta alla creazione di una nuova stringa, invece di modificare quella esistente. Con un gran numero di concatenazioni/modifiche delle stringhe, ciò porta a notevoli cali delle prestazioni e a un aumento del consumo di memoria.
Per lavorare con grandi quantità di testo, è consigliato utilizzare classi speciali per una manipolazione efficace delle stringhe. In Visual Basic .NET, questo è il System.Text.StringBuilder, che consente di modificare il buffer della stringa senza dover continuamente allocare nuova memoria.
Esempio con StringBuilder:
Imports System.Text Dim builder As New StringBuilder() For i As Integer = 1 To 100000 builder.Append("Stringa " & i & vbCrLf) Next Dim result As String = builder.ToString()
Domanda: "È possibile, lavorando con grandi file di testo, semplicemente concatenare le stringhe tramite l'operatore & e non preoccuparsi delle prestazioni?"
Risposta: No. Se concatenati le stringhe tramite & in un ciclo, per ogni iterazione viene creato un nuovo oggetto stringa e vengono copiati tutti i suoi caratteri. Questo è inefficiente per grandi volumi di dati. È meglio usare StringBuilder.
Esempio:
' Questo codice è molto lento con grandi N: Dim s As String = "" For i = 1 To 1000000 s = s & "a" Next ' Questo, invece, è molto più veloce: Dim sb As New StringBuilder() For i = 1 To 1000000 sb.Append("a") Next Dim s = sb.ToString()
Storia:
In un'applicazione web, il progetto raccoglieva le e-mail per le newsletter tramite una semplice concatenazione di stringhe in un ciclo usando
&. Con volumi superiori a 10.000 messaggi, il sistema cominciava a "bloccarsi" e crollava a causa di un'esaurimento della memoria. Dopo il passaggio a StringBuilder, questi problemi scomparvero.
Storia:
Nella procedura di registrazione degli errori, il log veniva raccolto tramite molteplici aggiunte di stringhe tramite somma normale. Questo aumentava notevolmente il tempo di registrazione del log e rallentava l'intero funzionamento del parser. Dopo un audit e un refactoring usando StringBuilder, la velocità di esecuzione aumentò di 5 volte.
Storia:
Nella generazione di report in file XLS popolari, l'analista adottò un approccio semplice: unire tutti i valori in una stringa tramite &. Risultato: durante la generazione di un report su 10.000 righe, l'applicazione smetteva di rispondere. La sostituzione con StringBuilder ha risolto il problema delle prestazioni e delle perdite di memoria.