VB.NET StringBuilder Examples

Improve performance when appending Strings with the StringBuilder class. Replace and insert data.

StringBuilder. This is an optimization. A class, StringBuilder improves common String operations. Appending, replacing and inserting are faster. It is easy to use.

With ToString, we can convert our data back into a String. This operation is optimized to avoid copies. With StringBuilder we have many built-in optimizations.Strings

First example. We see a program that declares a new StringBuilder. We append Strings and newlines to it. Finally the StringBuilder is converted to a String and written to the Console.

Imports: The first directive "Imports System.Text" lets us reference StringBuilder more directly in the program.

ToString: With this method, we convert the internal data of a StringBuilder into an actual String object.

VB.NET program that uses StringBuilder Imports System.Text Module Module1 Sub Main() ' Declare new StringBuilder Dim. Dim builder As New StringBuilder ' Append a string to the StringBuilder. builder.Append("Here is the list:") ' Append a line break. builder.AppendLine() ' Append a string and then another line break. builder.Append("1 dog").AppendLine() ' Get internal String value from StringBuilder. Dim s As String = builder.ToString ' Write output. Console.WriteLine(s) Console.ReadLine() End Sub End Module Output Here is the list: 1 dog

Replace. This example creates a StringBuilder with the constructor. Then it calls Replace() to replace one substring with another. Performance is good. No string temporaries are created.

Here: The starting buffer for the StringBuilder has the word "the" in it. After the Replace method is run, it instead has the word "my."

Return: Replace() returns a reference to the StringBuilder. We can ignore this return value, or call another method on it.

VB.NET program that uses Replace Imports System.Text Module Module1 Sub Main() Dim builder As New StringBuilder("Initialize the StringBuilder.") builder.Replace("the", "my") Console.WriteLine(builder.ToString) Console.ReadLine() End Sub End Module Output Initialize my StringBuilder.

Replace, all instances. The Replace() Function does not just replace the first instance of a string it finds. It changes all of them, no matter how many there are.
VB.NET program that uses Replace, multiple instances Imports System.Text Module Module1 Sub Main() Dim builder As New StringBuilder("I see a cat, and the cat sees me.") ' Replace all instances of substring. builder.Replace("cat", "dog") Console.WriteLine("RESULT: {0}", builder) End Sub End Module Output RESULT: I see a dog, and the dog sees me.

For-each. Here we use StringBuilder in a For-Each loop. Whenever we see Strings being appended in a loop, consider StringBuilder. It can improve runtime performance.

Here: A String array is declared. It contains 3 strings. A new StringBuilder is instantiated with a certain value.

Loop: In the For-Each loop, the Dim String is assigned to each String in the String array.

For Each, For

Finally: The StringBuilder has each string (and a newline) appended to it. After the loop, the results are printed to the Console.

VB.NET program that uses loop with StringBuilder Imports System.Text Module Module1 Sub Main() ' String array for use in loop. Dim items As String() = New String() {"Indus", "Danube", "Nile"} ' Initialize new StringBuilder. Dim builder As StringBuilder = New StringBuilder("These rivers are cool:").AppendLine ' Loop over each item in Array. Dim item As String For Each item In items builder.Append(item).AppendLine() Next ' Write result. Console.WriteLine(builder.ToString) Console.ReadLine() End Sub End Module Output These rivers are cool: Indus Danube Nile

Insert. This modifies a StringBuilder at the specified index. Here I specify the index 1, so the String literal is inserted after the first character in the buffer.
VB.NET program that uses Insert Imports System.Text Module Module1 Sub Main() Dim builder As StringBuilder = New StringBuilder("A cat") Console.WriteLine(builder) ' Insert this string at index 1. builder.Insert(1, " fluffy") Console.WriteLine(builder) End Sub End Module Output A cat A fluffy cat

Remove. This erases characters from a StringBuilder and collapse those following it. In this example, I remove four chars starting at index 1.

Result: The final data is missing those four chars, but contains the surrounding ones.

VB.NET program that uses Remove Imports System.Text Module Module1 Sub Main() Dim builder As StringBuilder = New StringBuilder("A big dog") Console.WriteLine(builder) ' Remove character starting at index 1. ' ... Remove 4 characters. builder.Remove(1, 4) Console.WriteLine(builder) End Sub End Module Output A big dog A dog

AppendFormat. Let us use the AppendFormat Function. AppendFormat receives a format string, usually with substitutions such as {0}, and parameters to fill those substitutions.

First: The Main entry point declares a StringBuilder. And then each Integer is looped over with For-Each.

Finally: Each integer is appended. Each integer is formatted to have one decimal place.


Tip: Using format strings, as with AppendFormat, often yields code that is easier to read and understand.

VB.NET program that uses AppendFormat Imports System.Text Module Module1 ''' <summary> ''' Integer array for example ''' </summary> Private m_values As Integer() = {5, 10, 15, 20} Sub Main() ' StringBuilder declaration. Dim b As New StringBuilder ' Declare new loop variable. Dim v As Integer For Each v In m_values ' Display with AppendFormat. b.AppendFormat(("Value: {0:0.0}" & Environment.NewLine), v) Next Console.WriteLine(b.ToString) End Sub End Module Output Value: 5.0 Value: 10.0 Value: 15.0 Value: 20.0

Benchmark. In appending, StringBuilder is faster than String. Consider this benchmark: we want to append 3-character string (abc). We compare StringBuilder and String.

Version 1: This version of the code uses StringBuilder to append a string 100 times.

Version 2: Here we use String and its concatenation operator to append a string 100 times. This creates 100 strings.

Result: When 2 strings are concatenated, a new String object results. Reducing allocations (with StringBuilder) improves performance.

VB.NET program that times StringBuilder, string appends Imports System.Text Module Module1 Sub Main() Dim m As Integer = 100000 ' Version 1: use StringBuilder. Dim s1 As Stopwatch = Stopwatch.StartNew For i As Integer = 0 To m - 1 Dim builder As StringBuilder = New StringBuilder For x As Integer = 0 To 99 builder.Append("abc") Next Next s1.Stop() ' Version 2: use String. Dim s2 As Stopwatch = Stopwatch.StartNew For i As Integer = 0 To m - 1 Dim str As String = "" For x As Integer = 0 To 99 str += "abc" Next Next s2.Stop() Dim u As Integer = 1000000 Console.WriteLine( s1.Elapsed.TotalMilliseconds.ToString("0.00 ms")) Console.WriteLine( s2.Elapsed.TotalMilliseconds.ToString("0.00 ms")) End Sub End Module Output 156.04 ms, StringBuilder Append 1020.00 ms, String concat

Performance advice. My research shows that appending two or three strings in a loop is faster than using StringBuilder. But using StringBuilder is faster for more than four iterations.

However: It is best to almost always use StringBuilder in loops. It can avert a performance disaster in edge cases.

StringBuilder Performance

Methods. These are my notes on methods you can use with StringBuilder. The documentation here is universal for all .NET languages. We can reference Microsoft Docs for all new types.

Append: Microsoft states that this "appends the string representation of a specified object to the end of this instance."

StringBuilder: Microsoft Docs

EnsureCapacity: This rarely is useful for changing the capacity, which is an optimization you can use.

Insert: This is similar to Replace. But we use it to add characters at a specific index.

Remove: This has the same effect as the Remove method on String, but it avoids character buffer copies.

Replace: This exchanges one substring in a StringBuilder with another. All instances (not just one) are changed.

Immutable. This term means that the data pointed at cannot be changed from our code. String is immutable. You cannot assign chars to its contents. But StringBuilder uses mutable buffers.

Important: In programs, we can improve performance by reducing allocations and objects.

So: With StringBuilder, we reuse one buffer to build up a collection of characters. With String, many objects are instead created.

Caution: We can add lots of data to StringBuilder. But we will get an ArgumentOutOfRange exception if we put more data than will fit.

HtmlTextWriter. HTML syntax uses lots of quotes and brackets. We can write HTML markup directly, without dealing with syntax: check out HtmlTextWriter.HtmlTextWriter

Note: Types such as HtmlTextWriter tend to reduce performance but improve code readability.

As developers, we will require StringBuilder in many applications. It is an excellent performance optimization. It can make unusable programs fast.

Often, we use StringBuilder in For-Each loops. For repeated appends, StringBuilder is ideal. Concatenating many strings is a sign that StringBuilder is needed.
Dot Net Perls
© 2007-2020 Sam Allen. Every person is special and unique. Send bug reports to