StringBuilder 类(int32,int32)中有构造函数。您会看到分别有两个参数容量和 maxCapacity 。
我试图在StringBuilder构造函数中搜索capacity和maxCapacity之间的差异。但是,我没有得到任何理解构造函数的东西。我找到了关于msdn的文档。不过,我不明白为什么需要它以及这些参数的用途是什么。我仍然想到一些问题,我应该在哪里使用这个构造函数?它是否有助于提高我的应用程序的性能?
答案 0 :(得分:4)
来自MSDN:StringBuilder(int,int)
初始化以...开头的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
示例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。但是,此值是特定于实现的,在其他或更高版本的实现中可能会有所不同
答案 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)
因此,使用此构造函数可以提高性能并设置限制。根据我的经验,我主要使用允许设置初始容量的构造函数,并且很少设置maxCapacity。但是,如果将来自未知来源的数据附加到StringBuilder ,则可能需要使用此构造函数,例如来自用户提供的文件,以便比处理OutOfMemoryException允许更早,更优雅地做出反应。因此,使用此构造函数还可以提高应用程序的稳健性。