我想知道这段代码是否……
StringBuilder sb = new StringBuilder("Please read the following messages.");
…使用与传递给构造函数的字符串完全一样大的缓冲区初始化sb.一方面,这似乎是最合乎逻辑的事情.另一方面,似乎有点打败StringBuilder类的目的,它的一个最常见的用途是提供可变性,使重复的追加更有效. (第一次调用Append,如果我的问题的答案是“是”,则需要sb自行调整大小.)
然后再次,我想可以将其视为类似于List< T>的构造函数.采用IEnumerable< T>作为参数.也许在这种情况下的假设是你不打算附加很多,而是操纵已经存在的东西.
我在这方面做的唯一真正的研究是检查MSDN documentation on StringBuilder,它没有提供答案(它表示构造函数使用指定的字符串初始化实例,但没有指出如何使用字符串).
编辑:所以这是“特定于实现”……这对其他人来说似乎并不奇怪吗?我的意思是,StringBuilder类的目的是提供对字符串执行大量操作的替代方法,在此过程中创建大量不可变的字符串实例;因此,这是为了提高效率.我觉得应该指定这个构造函数的行为,以便开发人员可以做出明智的决定如何使用它而不管平台.
我的意思是,它是由微软以某种方式实现的;他们可以很容易地将其放入文档中(迫使其他实现也遵循).只是个人困惑的来源……
解决方法
这是一个您不必担心的实现细节.但是,使用
.NET reflector,并查看构造函数(其他构造函数调用)的(string,int32,int32)重载,我们可以看到它选择的容量是16的倍数(下一个最大的请求尺寸)
编辑
实际上,它是16 x 2 ^ n,选择“n”的值作为下一个最大尺寸