5

StringBuilder当我有一个容量为 5的空时,我会写“你好,世界!” 对此,C# 标准是否指定了新的容量StringBuilder?我有一个模糊的记忆,它是新字符串长度的两倍(以避免改变每个新附加字符串的容量)。

4

3 回答 3

15

取决于您正在谈论的.NET 版本。在 .NET 4 之前,StringBuilder 使用标准的 .NET 策略,每次需要扩大内部缓冲区时,它的容量就会翻倍。

StringBuilder 为 .NET 4 完全重写,现在使用ropes。现在通过添加另一条最多 8000 个字符的绳索来扩展分配。不如早期策略有效,但避免了大缓冲区堵塞大对象堆的麻烦。如果您想仔细查看,可以从参考源中获得源代码。

于 2011-09-25T19:47:34.113 回答
5

C# 标准不会指定 BCL 库类的行为,因为它与语言规范无关。

据我所知,实际行为没有在任何规范中定义,并且是特定于实现的。

AFAIK,一旦达到当前容量,MS 实施将使容量翻倍。

请参阅这个这个以前的 SO 问题。


更新:

这已在 .NET 4.0 中更改。正如汉斯他的回答中所描述的那样。现在使用绳索,一次添加额外的 8000 个字符。

然而, MSDN非常小心地指出实际行为是特定于实现的:

StringBuilder 在需要时动态分配更多空间并相应地增加容量。出于性能原因,StringBuilder 可能会分配比需要更多的内存。分配的内存量是特定于实现的。

于 2011-09-25T19:02:35.443 回答
-1

m_ChunkChars新的 StringBuilder(.NET 4.5 或更高版本)分配容量参数请求的内部缓冲区:

public StringBuilder(int capacity) { ... m_ChunkChars = new char[capacity]; ... }

因此,如果容量小于 40K 字符,它将进入小对象堆。但是(与普遍的看法相反),StringBuilder 仍将在大对象堆上分配,如果稍后我们调用sb.Append(...some string larger than 40K chars...);一个可能的修复可以在这里找到: https ://github.com/amikunov/Large-Object-Heap-Fix-For -.NET-String-Builder

于 2017-05-18T20:46:14.103 回答