StringBuilder
当我有一个容量为 5的空时,我会写“你好,世界!” 对此,C# 标准是否指定了新的容量StringBuilder
?我有一个模糊的记忆,它是新字符串长度的两倍(以避免改变每个新附加字符串的容量)。
2450 次
3 回答
15
取决于您正在谈论的.NET 版本。在 .NET 4 之前,StringBuilder 使用标准的 .NET 策略,每次需要扩大内部缓冲区时,它的容量就会翻倍。
StringBuilder 为 .NET 4 完全重写,现在使用ropes。现在通过添加另一条最多 8000 个字符的绳索来扩展分配。不如早期策略有效,但避免了大缓冲区堵塞大对象堆的麻烦。如果您想仔细查看,可以从参考源中获得源代码。
于 2011-09-25T19:47:34.113 回答
-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 回答