在这种特殊情况下,两者实际上是相同的。编译器会将第二个变体(使用 + 运算符的变体)转换为对第一个变体 Concat 的调用。
好吧,也就是说,如果两者实际上包含串联的字符串变量。
这段代码:
B = "abc" + "def";
实际上转换成这个,根本没有连接:
B = "abcdef";
可以这样做,因为加法的结果可以在编译时计算,所以编译器会这样做。
但是,如果你要使用这样的东西:
A = String.Concat(stringVariable1, stringVariable2);
B = stringVariable1 + stringVariable2;
那么这两个将生成相同的代码。
但是,我想确切地知道那些“许多”所说的,因为我认为这是不同的东西。
我认为他们说的是字符串连接不好,你应该使用 StringBuilder 或类似的。
例如,如果你这样做:
String s = "test";
for (int index = 1; index <= 10000; index++)
s = s + "test";
然后发生的情况是,对于循环中的每次迭代,您将构建一个新字符串,并让旧字符串符合垃圾回收条件。
此外,每个这样的新字符串都会将旧字符串的所有内容复制到其中,这意味着您将移动大量内存。
而下面的代码:
StringBuilder sb = new StringBuilder("test");
for (int index = 1; index <= 10000; index++)
sb.Append("test");
将改为使用大于所需大小的内部缓冲区,以防您需要在其中添加更多文本。当该缓冲区已满时,将分配一个更大的新缓冲区,并将旧缓冲区留作垃圾回收。
所以在内存使用和CPU使用方面,后面的变种要好得多。
除此之外,我会尽量避免过多地关注“代码变体 X 是否比 Y 更好”,这超出了您已有的经验。例如,我现在使用 StringBuilder 只是因为我知道这种情况,但这并不是说我编写的所有使用它的代码实际上都需要它。
尽量避免花时间对代码进行微优化,直到您知道自己遇到了瓶颈。那个时候,先量后剪的惯用技巧仍然有效。