C# StringBuilder构造函数中的容量和最大容量有什么区别?

C# StringBuilder构造函数中的容量和最大容量有什么区别?,c#,.net,stringbuilder,C#,.net,Stringbuilder,在StringBuilder类(int32,int32)中有一个构造函数。您可以看到,分别有两个参数capacity和maxCapacity 我已经尝试在StringBuilder构造函数中搜索capacity和maxCapacity之间的差异。但是,我没有得到任何东西来理解这个构造函数。我在上找到了文档。不过,我不明白为什么需要它,以及这些参数的用途是什么。我脑子里仍然有一个问题,我应该在哪里使用这个构造函数?它有助于提高我的应用程序的性能吗?两者之间的差异 容量 如果要存储在当前实例中的字符

StringBuilder类(int32,int32)中有一个构造函数。您可以看到,分别有两个参数capacitymaxCapacity


我已经尝试在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不遵守此限制(请参见此)
因此,使用此构造函数可以提高性能并设置限制。根据我的经验,我主要使用允许设置初始容量的构造函数,很少使用设置maxCapacity的构造函数。但是,如果您将未知来源的数据附加到StringBuilder中,例如从用户提供的文件中,以便比处理OutOfMemoryException允许的更早、更优雅地作出反应,则可能需要使用此构造函数。因此,使用此构造函数还可以提高应用程序的健壮性。

来自MSDN:

初始化以开头的StringBuilder类的新实例 指定的容量,并且可以增长到指定的最大值

因此,
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