StringBuilder构造函数中capacity和maxCapacity的区别是什么?

时间:2014-03-01 06:20:37

标签: c# .net stringbuilder

StringBuilder 类(int32,int32)中有构造函数。您会看到分别有两个参数容量 maxCapacity

我试图在StringBuilder构造函数中搜索capacity和maxCapacity之间的差异。但是,我没有得到任何理解构造函数的东西。我找到了关于msdn的文档。不过,我不明白为什么需要它以及这些参数的用途是什么。我仍然想到一些问题,我应该在哪里使用这个构造函数?它是否有助于提高我的应用程序的性能?

5 个答案:

答案 0 :(得分:4)

来自MSDN:StringBuilder(int,int)

  

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

因此Capcity是必须开始/创建的尺寸,而MaxCapacityStringbuilder的限制。

示例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  

示例2:一次尝试以下示例

StringBuilder str = new StringBuilder(3, 5);
str.Append("1");      //no error as str Length 1 <= max limit 5         
str.Append("12");     //no error as str Length 3 <= max limit 5           
str.Append("123");    //error as str Length 6 is not <= max limit 5   

编辑:

MaxCapacity很少使用。

StringBuilder(int Capacity):使用Capacity参数在内存中创建StringBuilder对象。

一旦用户添加项目并且大小超过其容量限制,它就会分配更多内存来容纳超出的字符,并且除非内存没有问题,否则它会一直增长。

StringBuilder(int Capacity,int maxCapacity):它与上面一个参数构造函数相同,但在创建/增加其运行时内存以容纳超出的字符之前,它会检查MAXCAPACITY限制,如果超过MAXCAPACITY限制,则抛出Exception


来自以下的commnets:正如@Sriram所说,MaxCapacity参数与内存分配无关。

答案 1 :(得分:3)

区别

容量

如果要存储在当前实例中的字符数超过此容量值, StringBuilder 对象会分配额外的内存来存储它们。

但是,字符串构建器类提供了一种有效的方法 重复地将一些字符串附加到已构造的对象。

如果我们想要创建一个大字符串,StringBuilder很有用

容量表示分配给 StringBuilder 的连续内存。容量可以是> =字符串的长度。如果将更多数据附加到 StringBuilder 而不是容量, StringBuilder 会自动增加容量。由于容量已超过(连续内存已填满且没有更多缓冲区可用),因此会分配更大的缓冲区,并将数据从原始内存复制到此新区域。

它不会将数据复制到新的“实例”,而是复制到新的“内存位置”。实例保持不变,但指向新的内存位置。

StringBuilder 的默认容量(如果在创建期间未指定) 16

maxCapacity

如果要存储在当前实例中的字符数超过此maxCapacity值, StringBuilder 对象不会分配额外的内存,而是会抛出异常。< / p>

此实现的最大容量为Int32.MaxValue。但是,此值是特定于实现的,在其他或更高版本的实现中可能会有所不同

MSDN maxCapacity

答案 2 :(得分:2)

了解像StringBuilder这样的对象必须为其数据提供内部存储非常重要。这通常是一个阵列。通常,该数组的大小相当小。在向对象添加数据时,只要数据超出该数组的边界,就必须分配更多空间。如果指定初始capacity,则最初将使用该大小创建内部数组。这意味着在添加数据时不需要调整阵列大小。如果您知道要向StringBuilder添加至少N个字符,那么将N指定为初始capacity是有意义的,以避免不必要的大小调整。 maxCapacity是内部数组可以增加到的最大大小。

答案 3 :(得分:2)

阅读完所有答案后,最后,我了解了容量和maxCapacity之间的区别。现在我正在尝试一个例子来确定不同场景中的进程时间。所以,我将分享一些关于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 = new StringBuilder(3, 5)

 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

如果我使用maxCapacity创建StringBuilder的对象,那么在其他两种情况下附加文本需要更多时间。但是,声明对象与容量和没有容量之间没有区别。我认为检查已定义的字符串构建器类对象的最大容量需要一些时间。

答案 4 :(得分:1)

  • 容量用于StringBuilder的起始容量。 Capacity是StringBuilder分配的当前内存。如果添加文本,则在超出当前容量时,需要增加分配的内存量。这需要一些时间。为了避免调整StringBuilder的内存大小,可以将其设置为更高的值,并通过提高应用程序的性能。如果你知道你想要构建的字符串在多长时间内具有很高的概率,那么这是一个很好的起点,因为你减少了内存重新分配的数量。
  • maxCapacity 标记StringBuilder的最大容量,并允许限制StringBuilder使用的内存量。如果向其添加数据,则内存不会超过此限制,但会引发异常。因此,如果您的应用程序想要向StringBuilder添加更多内容,则可以避免遇到内存问题。但请注意,在某些情况下,.NET 4不会遵守此限制(请参阅此link)。

因此,使用此构造函数可以提高性能并设置限制。根据我的经验,我主要使用允许设置初始容量的构造函数,并且很少设置maxCapacity。但是,如果将来自未知来源的数据附加到StringBuilder ,则可能需要使用此构造函数,例如来自用户提供的文件,以便比处理OutOfMemoryException允许更早,更优雅地做出反应。因此,使用此构造函数还可以提高应用程序的稳健性。