为什么StringBuilder的默认容量是16个字符?

3
为什么StringBuilder的默认容量是16个字符?这是一种优化吗?
StringBuilder builder = new StringBuilder();
Console.WriteLine("builder capacity: '{0}'", builder.Capacity);

输出:

builder capacity: '16'

2
有关编程的内容翻译:这重要吗?我愿意打赌,有人只是选择了一个合理的数字。 - Bernard
2
我的问题的主要部分是为什么? - Darius Kucinskas
1
@DariusKucinskas 你的意思是为什么? - Ray
4
在这种情况下,将其标记为“完全重复”是不正确的。虽然我会倾向于将其标记为“不是一个真正的问题”(尽管它是一个问题,但实际上并没有令人满意的答案...;-) - Adam Houldsworth
2
StringBuilder在其缓冲区不足以存储修改后的字符串时会使其容量加倍(http://www.dotnetperls.com/stringbuilder-capacity)。首先,我认为在类似情况下,每个程序员都会选择初始大小为2的幂。其次,初始大小必须足够小,以有效处理小字符串。第三,英语单词的平均长度(微软是一家美国公司!)约为5个字符。总之,内部char数组的初始长度应该是接近但大于5的2的幂,即8。由于Unicode char大小为2,因此默认容量应为16 :) - kol
显示剩余3条评论
1个回答

5
如果在初始化StringBuilder实例时没有指定容量或最大容量,则使用特定于实现的默认值。 直接从MSDN文档中获取。 他们真正无法优化任何东西,因为它完全取决于使用情况,因此他们让您在构造函数中指定容量,以便您自己进行优化。如果您没有指定任何内容,他们会纯粹地猜测您想要一些容量。
对于列表也是如此。他们不知道您想要多少项或应用程序中列表包含的平均项数。他们公开容量,以便您可以将列表大小强制设置为某些值,从而防止其过于频繁地增长。在这种情况下,StringBuilder并没有什么不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接