C# StringBuilder构造函数中的容量和最大容量有什么区别?
在StringBuilder类(int32,int32)中有一个构造函数。您可以看到,分别有两个参数capacity和maxCapacityC# StringBuilder构造函数中的容量和最大容量有什么区别?,c#,.net,stringbuilder,C#,.net,Stringbuilder,在StringBuilder类(int32,int32)中有一个构造函数。您可以看到,分别有两个参数capacity和maxCapacity 我已经尝试在StringBuilder构造函数中搜索capacity和maxCapacity之间的差异。但是,我没有得到任何东西来理解这个构造函数。我在上找到了文档。不过,我不明白为什么需要它,以及这些参数的用途是什么。我脑子里仍然有一个问题,我应该在哪里使用这个构造函数?它有助于提高我的应用程序的性能吗?两者之间的差异 容量 如果要存储在当前实例中的字符
我已经尝试在StringBuilder构造函数中搜索capacity和maxCapacity之间的差异。但是,我没有得到任何东西来理解这个构造函数。我在上找到了文档。不过,我不明白为什么需要它,以及这些参数的用途是什么。我脑子里仍然有一个问题,我应该在哪里使用这个构造函数?它有助于提高我的应用程序的性能吗?两者之间的差异 容量 如果要存储在当前实例中的字符数超过此容量值,StringBuilder对象将分配额外的内存来存储这些字符 然而,字符串生成器类提供了一种有效的方法 向已构造的对象重复附加字符串位 如果我们想制作一个大字符串,StringBuilder很有用 容量表示分配给StringBuilder的连续内存。容量可以大于等于字符串的长度。当添加到StringBuilder的数据多于容量时,StringBuilder会自动增加容量。由于容量已超过(即连续内存已满且没有更多可用的缓冲空间),因此会分配更大的缓冲区,并将数据从原始内存复制到此新区域 它不会将数据复制到新的“实例”,而是复制到新的“内存位置”。实例保持不变,但指向新的内存位置 如果在创建过程中未指定,StringBuilder的默认容量为16 最大容量 如果要存储在当前实例中的字符数超过此maxCapacity值,StringBuilder对象不会分配额外内存,而是引发异常 此实现的最大容量为Int32.MaxValue。但是,此值是特定于实现的,在其他或更高的实现中可能会有所不同
了解像StringBuilder这样的对象必须为其数据提供内部存储,这一点很重要。这通常是一个数组。通常,该数组的大小相当小。在向对象添加数据时,每当数据超出该数组的边界时,都必须分配更多的空间。如果指定初始
容量
,则最初将使用该大小创建内部阵列。这意味着随着数据的添加,调整数组大小的需要会减少。如果您知道将向StringBuilder添加至少N个字符,那么将N指定为初始容量是有意义的,以避免不必要的大小调整maxCapacity
是内部阵列可以增加到的最大大小。- 容量用于StringBuilder的启动容量。容量是StringBuilder分配的当前内存。如果添加文本,如果超出当前容量,则需要增加分配的内存量。这需要一些时间。为了避免调整StringBuilder的内存大小,可以将其设置为更高的值,从而提高应用程序的性能。如果您在很高的概率下知道要构建的字符串的最大长度,这是减少内存重新分配数量的一个很好的起点
- maxCapacity标记StringBuilder的最大容量,并允许限制StringBuilder使用的内存量。如果向其中添加数据,内存不会超过此限制,但会引发异常。因此,如果应用程序希望向StringBuilder添加更多内容,则可以避免遇到内存问题。但是,请注意,在某些情况下,.NET4不遵守此限制(请参见此)
Capcity
是启动/创建它的大小,MaxCapacity
是Stringbuilder
的限制
示例1:逐个尝试以下示例
StringBuilder str = new StringBuilder(3, 5);
str.Append("1"); //no error as Length 1 <= max limit 5
str.Append("12"); //no error as Length 2 <= max limit 5
str.Append("123"); //no error as Length 3 <= max limit 5
str.Append("1234"); //no error as Length 4 <= max limit 5
str.Append("12345"); //no error as Length 5 <= max limit 5
str.Append("123456"); //error as Length 6 is not <= max limit 5
StringBuilder str=新的StringBuilder(3,5);
str.Append(“1”)//没有错误,长度1阅读所有答案后,我终于理解了容量和最大容量之间的区别。现在我试着用一个例子来确定不同场景中的处理时间。所以,我将分享一些关于StringBuilder构造函数的内容。我在以下情况下测试了StringBuilder.Append方法,并得到了一些结果
应用程序代码很简单
System.Diagnostics.Stopwatch stp = new System.Diagnostics.Stopwatch();
stp.Start();
StringBuilder str = new StringBuilder()
str.Append("12345");
Console.WriteLine(stp.ElapsedTicks);
在StringBuilder的声明中,我使用了以下构造函数
即StringBuilder str=新的StringBuilder(3,5)
结果如下
Trial (capacity,maxCapacity) (capacity) Without Capacity
1 31018 25259 28847
2 32682 25025 24635
3 32513 27404 25168
4 31330 26013 24986
5 31616 24050 25324
如果我用maxCapacity创建StringBuilder的对象,那么附加文本比附加其他内容需要更多的时间
1. (int32,int32) : (capacity, maxCapacity)
2. (int32) : (capacity)
3. () : Without capacity (No Parameters)
Trial (capacity,maxCapacity) (capacity) Without Capacity
1 31018 25259 28847
2 32682 25025 24635
3 32513 27404 25168
4 31330 26013 24986
5 31616 24050 25324