HomeSearch

VB.NET StringBuilder Examples

Use the StringBuilder class to improve performance with String appends.

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,

we see an example 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: Please take note of the first directive, which imports the System.Text namespace.

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. This is not necessary to assign, as it is equal to the first reference.

However: The reference is useful when calling StringBuilder methods on themselves, as in "fluent" interfaces.

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.

For-each.

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

Here: A String array is declared. It contains three 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.

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.

Integer

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

Performance.

In appending, StringBuilder is faster than String. Consider this benchmark. I append a 3-character string (abc) 100 times. With StringBuilder, the loop is 9 times faster.

Tip: No string allocations occur when Append is called. But when two strings are concatenated, a new String object results.

And: Reducing allocations, and objects, improves performance in the .NET Framework.

VB.NET program that times StringBuilder, string appends Imports System.Text Module Module1 Sub Main() Dim m As Integer = 100000 ' 1: Append 100 strings together with 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() ' 2: Append 100 strings together with 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 functions the same as the Remove method on String, but it avoids character buffer copies.

Replace: This replaces one substring in your StringBuilder with another. An example is shown on this page.

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.

This is key: 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.
Home
Dot Net Perls
© 2007-2019 Sam Allen. All rights reserved. Written by Sam Allen, info@dotnetperls.com.