- Strings
- String Vs StringBuilder Comparison
String Vs StringBuilder Comparison

String vs StringBuilder are similar and in most cases we will will use string but in the case of concatenation between two strings or combining strings by many times then we may need a more efficient option in StringBuilder.
Why We Use String?
Strings are very useful for a variety of circumstances. They are used for holding and displaying a variety of character types and numerical representation. A string itself is a array of char types. So a string can be indexed and can be cut up and manipulated. It can represent numbers and store those values and a combination of characters and number values.
How Strings Works
Strings are reference types that are immutable. This means once it is created it can’t be changed. But when we try to change the value instead updating the string it creates a new string in it’s place. So when we declare a reference to a string object and give it a value and then behind the scenes a new string object is created. This is different than some other types such as an int. When we create an int variable we can change the value, C# does not create a new int variable but it changes the value of int. Below is some sample code of what I just saw about string.
static void Main(string[] args)
{
string myValue = "Some Text";
Console.WriteLine(myValue);
myValue = "Some New Text"; // a new string object is created and replaces the previous value;// a new string object is created and replaces the previous value;
Console.WriteLine(myValue);
}
Output
Some Text
Some New Text
Motivation for StringBuilder
A drawback in string is that it can slow down our application in cases where we are assigning and reassigning the string value many times. Because as we mentioned before each time we change a string, in the backend it is not being changed or updated but replaced by a new string object each time. This is an over head if we are doing a lot string manipulations. With the StringBuilder object we can get around this overhead when we manipulate strings. StringBuilder is recommended to use if we are using heavy string operations. Below is an example of the time comparisons between the two objects.
Full example solution if your interested below.
using System;
using System.Diagnostics;
using System.Text;
namespace StringVsStringBuilder
{
class Program
{
public static int Count = 10000;
public int MyProperty { get; set; }
static void Main(string[] args)
{
GenerateRandomTextByStringBuilder();
GenerateRandomTextByString();
}
private static void GenerateRandomTextByString()
{
string randomLetters = "abcdefghijklmnopqrstuvwxyz";
Stopwatch stopWatch = new Stopwatch();
Random random = new Random();
stopWatch.Start();
string myContent = "Some Random Text With String:";
for (int i = 0; i < Count; i++)
{
int randomIndex = random.Next(0, randomLetters.Length);
myContent += randomLetters[randomIndex];
}
stopWatch.Stop();
Console.WriteLine(myContent);
Console.WriteLine($"GenerateRandomTextByString:In Minutes:{stopWatch.Elapsed.Minutes}, seconds:{stopWatch.Elapsed.Seconds}, milliseconds:{stopWatch.Elapsed.Milliseconds}");
}
private static void GenerateRandomTextByStringBuilder()
{
string randomLetters = "abcdefghijklmnopqrstuvwxyz";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
StringBuilder myContent = new StringBuilder("Some Random Text With String:");
Random random = new Random();
for (int i = 0; i < Count; i++)
{
int randomIndex = random.Next(0, randomLetters.Length);
myContent.Append(randomLetters[randomIndex]);
}
string finalOutput = myContent.ToString();
stopWatch.Stop();
Console.WriteLine(finalOutput);
Console.WriteLine($"GenerateRandomTextByStringBuilder:In Minutes:{stopWatch.Elapsed.Minutes}, seconds:{stopWatch.Elapsed.Seconds}, milliseconds:{stopWatch.Elapsed.Milliseconds}");
}
}
}
Next we'll look at each function
private static void GenerateRandomTextByString()
{
string randomLetters = "abcdefghijklmnopqrstuvwxyz";
Stopwatch stopWatch = new Stopwatch();
Random random = new Random();
stopWatch.Start(); string myContent = "Some Random Text With String:";
for (int i = 0; i < Count; i++)
{
int randomIndex = random.Next(0, randomLetters.Length);
myContent += randomLetters[randomIndex];
}
stopWatch.Stop();
Console.WriteLine(myContent);
Console.WriteLine($"GenerateRandomTextByString:Content Generated In Minutes:{stopWatch.Elapsed.Minutes}, seconds:{stopWatch.Elapsed.Seconds}, milliseconds:{stopWatch.Elapsed.Milliseconds}");
}
Let’s note that the time that it takes to complete 10000 string additions to an existing string. This addition is a concatenate operation. It is combining the previous a string to another string.
Output
Some Random Text With String:..czfizeyiozxztpxhganuvegpphisdghekgg
GenerateRandomTextByString:In Minutes:0, seconds:0, milliseconds:10
It takes 18 milliseconds to concatenate 10000 strings together which is under a second. It seems fast but let’s see how long it takes the do the same operation with a string builder object.
private static void GenerateRandomTextByStringBuilder()
{
string randomLetters = "abcdefghijklmnopqrstuvwxyz";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start(); StringBuilder myContent = new StringBuilder("Some Random Text With String:");
Random random = new Random();
for (int i = 0; i < Count; i++)
{
int randomIndex = random.Next(0, randomLetters.Length);
myContent.Append(randomLetters[randomIndex]);
}
string finalOutput = myContent.ToString();
stopWatch.Stop();
Console.WriteLine(finalOutput);
Console.WriteLine($"GenerateRandomTextByStringBuilder:Content Generated In Minutes:{stopWatch.Elapsed.Minutes}, seconds:{stopWatch.Elapsed.Seconds}, milliseconds:{stopWatch.Elapsed.Milliseconds}");
}
Output
Some Random Text With String:...lgnveeadliwoaavtcxfblbbjrfgqqjyoiepjdogrcjxfthvdgeqrrhskfeezxk
GenerateRandomTextByStringBuilder:In Minutes:0, seconds:0, milliseconds:1
String vs StringBuilder Test Conclusions
Wow, it takes only 1 millisecond to do this operation with a StringBuilder object. Since we are talking about differences in milliseconds this may not seem like a big deal but in large scale applications that crunch a lot of data this kind of optimizations are cost and time savers.
String and StringBuilder Considerations
We need to pick the right tools for the job and know when to take the trade offs when necessary. If I’m building a quick application and I’m just storing and displaying string values then a StringBuilder object isn’t necessary. But if I find myself doing a lot of string manipulation then I might consider using StringBuilder. String and StringBuilder are both useful but it depends on the context, needs and resources that you have.