我已经阅读了多个地方,在 Java 1.5+ 中,String
连接被优化为StringBuilder
在编译程序时使用 a 。我不清楚这是标准还是许多编译器采用的常见优化。对此的任何澄清将不胜感激,但主要是我的第二个问题的引导。
.NET 是否同样优化?我知道,如果我使用StringBuilder
它会消除任何歧义,但我个人发现它的简单性+
更易于阅读。如果 .NET 有,这是否从特定版本开始?详细说明是赞赏。
我已经阅读了多个地方,在 Java 1.5+ 中,String
连接被优化为StringBuilder
在编译程序时使用 a 。我不清楚这是标准还是许多编译器采用的常见优化。对此的任何澄清将不胜感激,但主要是我的第二个问题的引导。
.NET 是否同样优化?我知道,如果我使用StringBuilder
它会消除任何歧义,但我个人发现它的简单性+
更易于阅读。如果 .NET 有,这是否从特定版本开始?详细说明是赞赏。
来自 MSDN:
字符串对象连接操作总是从现有字符串和新数据创建一个新对象。StringBuilder 对象维护一个缓冲区来容纳新数据的连接。如果空间可用,则将新数据附加到缓冲区;否则,分配一个新的更大的缓冲区,将原始缓冲区中的数据复制到新缓冲区,并将新数据附加到新缓冲区。
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的频率。String 连接操作总是分配内存,而 StringBuilder 连接操作仅在 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。如果要连接固定数量的 String 对象,请使用 String 类。在这种情况下,编译器甚至可以将单独的串联操作组合成一个操作。如果要连接任意数量的字符串,请使用 StringBuilder 对象;例如,如果您使用循环连接随机数量的用户输入字符串。
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
希望这将使您对 StringBuilder 有更好的看法,然后使用 + 进行字符串连接
性能注意事项
字符串对象连接操作总是从现有字符串和新数据创建一个新对象。StringBuilder 对象维护一个缓冲区来容纳新数据的连接。如果空间可用,则将新数据附加到缓冲区;否则,分配一个新的更大的缓冲区,将原始缓冲区中的数据复制到新缓冲区,并将新数据附加到新缓冲区。
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的频率。String 连接操作总是分配内存,而 StringBuilder 连接操作仅在 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。如果要连接固定数量的 String 对象,请使用 String 类。在这种情况下,编译器甚至可以将单独的串联操作组合成一个操作。如果要连接任意数量的字符串,请使用 StringBuilder 对象;例如,如果您使用循环连接随机数量的用户输入字符串。
不,+ 运算符未使用 .NET 中的 StringBuilder 进行优化。在 MSDN 中,有一个提到,如果你想加快字符串操作,你可以使用 StringBuilder
不,AFAIK .NET 不会自动执行此操作,您需要具体说明。+
每次使用都会创建一个新字符串,因为字符串类型是不可变的。
我建议阅读此示例:连接字符串的最有效方法?
Hint
- 接受的答案可能并不总是正确的。
这:http ://en.csharp-online.net/Manipulating_Strings_in_CSharp%E2%80%94Concatenating_Strings
如果在一次操作中使用 连接多个字符串String.Concat
,.net 会将它们的长度相加,创建一个合适大小的新字符串对象,并将源字符串中的所有字符复制到新字符串中。如果您在一次String.Concat
调用中执行四个或更少的字符串,则会创建一个新对象(新字符串);除非旧字符串之一被废弃并因此变成垃圾,否则不会创建“垃圾”。如果您连接五个或更多字符串,String[]
将创建一个新的临时变量来保存参数,但它会很小且寿命很短(因此相对无害),无论字符串的长度如何,除非您传递了数千个的参数。
+
此外,可以使用C# 中的运算符或 vb.net 中的+
or运算符连接任意数量的常量字符串&
,编译器会将它们变成一个更大的常量字符串。我不确定是什么规则规定了 C# 或 vb.net 编译器将字符串合并到包含多个常量和非常量字符串的表达式中的程度(尤其是在涉及括号的情况下);根据需要使用String.Concat
带有尽可能多参数的调用,但使用+
在参数中合并常量字符串,在任何情况下都应该产生最佳代码。