在字符串上使用+=的任何问题
本文关键字:任何 问题 字符串 | 更新日期: 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
,然后将结果赋值给变量。
如果重复执行此操作,可以看到每次+=
操作都会一次又一次地复制字符串的开头。在构建长字符串的循环中,这可能会产生影响。这可以通过使用StringBuilder
或List<string>
和string.Concat()
来优化,这样您只复制最终结果的每个部分一次(或其他与循环迭代次数无关的常数)。
你的方法会很好。您可以使用StringBuilder作为替代方案。
var sb = new StringBuilder();
sb.Append("Foo");
sb.Append(" - ");
sb.Append("Bar");
string someString = sb.ToString();