在字符串上使用+=的任何问题

本文关键字:任何 问题 字符串 | 更新日期: 2023-09-27 17:53:00

正如标题所示,我有什么理由不做下面的事情来在字符串的末尾添加一些东西呢?

string someString = "test";
someString += "Test";

在字符串上使用+=的任何问题

如果做一次,没什么大不了的。获取两个字符串的内容,创建一个新字符串并将其赋值给someString。如果您多次执行上述操作(例如,在循环中),那么就会出现问题。对于每次执行,都在堆中分配一个新对象,一个新的字符串实例。这就是为什么如果您必须多次向字符串追加内容,那么最好使用基于缓冲区的类型,例如StringBuilder

如果您做了以下操作:

var s = "abc";
s += "def";
s += "ghi";

发生的(或多或少)是在第2行,当创建新字符串时,将abc的内容复制到其中,然后将def的内容复制到其中,然后将这个新字符串(abcdef)赋值给变量。

然后在第3行,创建另一个新字符串,将变量的前一个值(abcdef)的内容复制到其中,然后是ghi,然后将结果赋值给变量。

如果重复执行此操作,可以看到每次+=操作都会一次又一次地复制字符串的开头。在构建长字符串的循环中,这可能会产生影响。这可以通过使用StringBuilderList<string>string.Concat()来优化,这样您只复制最终结果的每个部分一次(或其他与循环迭代次数无关的常数)。

你的方法会很好。您可以使用StringBuilder作为替代方案。

var sb = new StringBuilder();
sb.Append("Foo");
sb.Append(" - ");
sb.Append("Bar"); 
string someString = sb.ToString();