How the StringBuilder class is implemented? Does it internally create new string objects each time we append?

.net, c#, string, stringbuilder

Solution

In .NET 2.0 it uses the `String` class internally. `String` is only immutable outside of the `System` namespace, so `StringBuilder` can do that.

In .NET 4.0 `String` was changed to use `char[]`.

In 2.0 `StringBuilder` looked like this

public sealed class StringBuilder : ISerializable
{
    // Fields
    private const string CapacityField = "Capacity";
    internal const int DefaultCapacity = 0x10;
    internal IntPtr m_currentThread;
    internal int m_MaxCapacity;
    internal volatile string m_StringValue; // HERE ----------------------
    private const string MaxCapacityField = "m_MaxCapacity";
    private const string StringValueField = "m_StringValue";
    private const string ThreadIDField = "m_currentThread";

But in 4.0 it looks like this:

public sealed class StringBuilder : ISerializable
{
    // Fields
    private const string CapacityField = "Capacity";
    internal const int DefaultCapacity = 0x10;
    internal char[] m_ChunkChars; // HERE --------------------------------
    internal int m_ChunkLength;
    internal int m_ChunkOffset;
    internal StringBuilder m_ChunkPrevious;
    internal int m_MaxCapacity;
    private const string MaxCapacityField = "m_MaxCapacity";
    internal const int MaxChunkSize = 0x1f40;
    private const string StringValueField = "m_StringValue";
    private const string ThreadIDField = "m_currentThread";

So evidently it was changed from using a `string` to using a `char[]`.

EDIT: Updated answer to reflect changes in .NET 4 (that I only just discovered).

Problem

How the StringBuilder class is implemented? Does it internally create new string objects each time we append?

Original source