36

a 的默认容量是StringBuilder多少?

什么时候应该(或不应该)使用默认值?

4

8 回答 8

49

StringBuilder 的默认容量是 16 个字符(我使用 .NET Reflector 来查找)。

于 2008-10-29T09:36:56.430 回答
36

默认值为 16,这似乎是 .NET 框架中任何类型的数组或列表的默认容量。您在 StringBuilder 上需要的重新分配次数越少越好。同时,也没有必要分配比需要更多的东西。

我通常对 StringBuilder 的最终大小进行某种粗略估计来实例化 StringBuilder。例如,这可能基于您稍后将用于构建字符串的一些迭代计数,乘以该迭代中每个项目所需的大小。

// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}

当 StringBuilder 的大小太小而无法写入下一个字符串时,StringBuilder 的内部 char 数组将重新分配为其当前大小的两倍。

于 2008-10-29T11:30:22.257 回答
13

这个问题今天作为另一个问题的重复出现,但我注意到其中一部分没有得到回答。正如人们所说,默认值(假设这意味着“当没有使用足够大的字符串创建时 require )是 16,但我在这里看不到任何关于何时应该更改它的内容。

当您可以更改它作为可能的优化时,您可以更改它。实际上,选择 16 与优化相反。优化是选择值和方法,以便特别适合特定情况或可能情况的子集(通常不是“让事情变得更快”,尽管我们经常使用这个词)。在这里,类的设计者必须处理泛化——选择值和方法,以便在广泛的案例中提供相当好的性能。

它们越小,内存的使用就越少。

它们越大,处理更大字符串的重新分配就越少。

在某些情况下,二进制回合(2 的整数次方)可能比其他数字提供更好的性能有几个原因,所以他们选择了其中一个,但除了在 4 或 16 或 1024 之间进行选择之外,还有一个问题平衡不同的可能值。

使用 而不是设计它的人StringBuilder可能对他们可能需要的尺寸有更好的了解。

如果他们要5 个 1 位数字以及总长度为 43 个字符的字符串,那么无论如何Append总长度将是 48 个字符,所以他们应该使用 48 的容量,因为 48 始终是StringBuilder长度为 48 的字符串的最有效大小。

如果他们正在做的事情可能有大约 23 到 34 个字符之间的任何长度,他们应该使用 34。

如果他们正在做的事情可能永远不会超过 60 个字符,但偶尔可能会有,他们应该使用 64(不要为大多数部分重新分配,并获得上面提到的二的幂的好处你这样做的少数情况)。

如果无法就此得出结论,或者至少很难得出结论并且不是性能热点,那么您应该使用默认值。

于 2011-12-15T16:35:24.303 回答
5

可敬的 J. Skeet 对这个问题进行了很好的分析:

https://jonskeet.uk/csharp/stringbuilder.html

于 2008-10-29T09:36:54.170 回答
2

String-Builder 的默认容量为16 个字符,String-Builder 的最大容量为2147483647 个字符

所以无需担心存储长响应!

于 2017-10-11T06:15:04.460 回答
1

我们可以使用类的容量属性找到容量StringBuilder

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

这里容量定义了默认容量StringBuilder

StringBuilderisMax Capacity与 的最大值相同Int32

于 2013-09-20T05:11:55.477 回答
0

[编辑:当时,被问到的问题StringList]

你的意思是StringCollection?这最初使用一个空ArrayList,所以答案是 0。你没有选择改变它。当你第一次添加一个项目时,容量会跳到 4,然后在它填满时使用加倍策略。

如果您的意思是List<string>,那么它是相似的(一个空T[]的,而不是一个ArrayList),但是如果您需要,您可以初始化一个已知的大小(即您知道您期望多少数据)。同样,第一次Add到 a时List<T>,大小会跳到 4,然后每次填满时都会翻倍。

于 2008-10-29T09:25:59.043 回答
-1

阅读有关Stringbuilder 容量的信息,也有示例应用程序可以证明这一点。

于 2008-10-29T09:36:50.567 回答