StringBuilder的默认容量

时间:2008-10-29 09:23:43

标签: c# .net stringbuilder capacity

StringBuilder的默认容量是什么?

何时应该(或不应该)使用默认值?

8 个答案:

答案 0 :(得分:42)

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

答案 1 :(得分:35)

默认值为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数组被重新分配为其当前大小的两倍。

答案 2 :(得分:12)

今天这个问题与另一个问题重复,但我注意到有一部分没有得到回答。默认情况下(假设这意味着“当没有使用足够大的字符串创建时)”就像人们所说的那样是16,但是当你应该更改它时我没有看到任何内容。

如果可以进行优化,则可以更改它。实际上,16的选择与优化相反。 优化正在挑选价值观和方法,以便特别适合特定情况或可能情况的子集,(通常不会“加快速度”,尽管我们经常使用这个词)。在这里,该类的设计者必须处理泛化 - 挑选价值和方法,以便在广泛的案例中提供相当好的表现。

他们越小,记忆的使用就越少。

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

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

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

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

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

如果他们做的事情可能永远不会超过60个字符,但偶尔会出现这种情况,他们应该使用64(不要为大多数部分重新分配,并获得两个权力的好处上面提到的少数几个案例。)

如果无法对此作出结论,或者至少很难这样做而不是表演热点,那么你应该使用默认值。

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

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

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

此处,capacity定义StringBuilder的默认容量。

StringBuilder Max CapacityInt32的最大值相同。

答案 5 :(得分:0)

[编辑:当时,问题是关于StringList]

你的意思是StringCollection?这最初使用空ArrayList,因此答案为0.而且您无法更改它。当您第一次添加项目时,容量会跳转到4,然后在填充时使用加倍策略。

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

答案 6 :(得分:0)

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

因此无需担心存储长响应!!!

答案 7 :(得分:-1)

阅读有关Stringbuilder capacity 的内容,还有示例应用来证明这一点。