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?