C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
A class, it 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.
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.
Based on: .NET 4.5 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.
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
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 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 Results 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.
Methods. These are my notes on methods you can use with StringBuilder. The documentation here is universal for all .NET languages. As developers, we should reference MSDN for all new types.
Append: MSDN states that this "appends the string representation of a specified object to the end of this instance."
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.
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.