如何StringBuilder类中实现?是否每次我们追加一次内部创建新的字符串对象?字符串、类中、对象、StringBuilder

2023-09-02 10:22:27 作者:咖啡不懂酒的醉i

如何StringBuilder类中实现?它是否在内部创建新的String对象每次我们添加的时间?

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

推荐答案

在.NET 2.0中在内部使用了字符串类。 字符串只是一成不变的外系统命名空间,所以的StringBuilder 能做到这一点。

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

在.NET 4.0 字符串改为使用的char []

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

在2.0 的StringBuilder 这个样子

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";

但在4.0,它看起来是这样的:

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";

所以很显然,这是从使用字符串来使用改变了的char []

编辑:更新的答案,以反映在.NET 4的变化(我刚刚发现的)

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