2011-07-28 21 views
0

“...如果连接固定数量的String对象,则String类更适合于连接操作。在这种情况下,单独的连接操作甚至可以组合成单个操作编译器。固定数量的.NET字符串连接

一个StringBuilder对象是最好的结合动作,如果字符串任意数量的被连接起来......”

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

件事,让我是不确定的话‘甚至可能是’在第一段。它不应该“肯定会”吗?因为如果没有将连接组合成一个操作,String的重复内存分配将使其与StringBuilder相比绝对劣势。

回答

2

那么,它也可能没有明显的区别。说实话,他们会因为琐碎的连接而离得很近,但是:对于一个操作中的“n”个字符串的直接连接,Concat(aka +)会发光;长度等可以有效地计算出来,然后就是复制。在一个循环中,StringBuilder将发光。

当你的毗连在一个操作

string s = a + b + c + x + y + z; 

这是真的:

string s = string.Concat(a, b, c, x, y, z); 

这是唯一一个额外的字符串。

+0

因此,是否使用变量或硬编码文字并不重要,对吗?只要连接在一行代码中,它们将被合并? –

+0

@SValmont - one *表达*(不是一行),是的。请注意,如果*文字或常量*相邻,编译器将在构建时执行它(不是在运行时)。 –

+0

接受6个参数的Concat()没有超载。 –

0

这就是说,如果字符串的长度可以在编译时确定,编译器会自动将它合并为一个更高效的表示形式。但是,如果在编译时无法计算长度,则应使用StringBuilder。

“甚至可能”是如果您只连接两个不确定长度的字符串,使用String可能会更快。串联的字符串越多,StringBuilder的好处就越多。

0

我的猜测是你可以用编译器不会将它合并成一个的方式编写代码。但是,如果您按照微软希望的方式编写代码,则应该在一次操作中完成。