正如标题所暗示的那样,有什么理由我不应该执行以下操作将某些内容附加到字符串的末尾:
string someString = "test";
someString += "Test";
如果做一次,没什么大不了的。获取两个字符串的内容,创建一个新字符串并将其分配给someString
. 如果你多次执行上述操作(例如,在一个循环中),那么就有问题了。对于每次执行,您都在堆中分配一个新对象,一个新的字符串实例。这就是为什么最好使用基于缓冲区的类型,例如StringBuilder
,如果您必须多次将内容附加到字符串。
如果您执行以下操作:
var s = "abc";
s += "def";
s += "ghi";
(或多或少)发生的是,在第 2 行,在创建新字符串时,将 的内容abc
复制到其中,然后将 的内容def
复制到其中,然后将这个新字符串 ( abcdef
) 分配给多变的。
然后在第 3 行,创建另一个新字符串,将变量 ( ) 的先前值的内容abcdef
复制到其中,ghi
然后将结果分配给变量。
+=
如果您反复执行此操作,您可以看到字符串的开头在每次操作中都被一次又一次地复制。在建立长字符串的循环中,这可能会产生影响。这可以通过使用 aStringBuilder
或 a List<string>
with来优化string.Concat()
,这样您就只能复制最终结果的每个部分一次(或其他与循环迭代次数无关的常数)。
你的方法会很好用。您可以使用 StringBuilder 作为替代方案。
var sb = new StringBuilder();
sb.Append("Foo");
sb.Append(" - ");
sb.Append("Bar");
string someString = sb.ToString();