首页 > 解决方案 > 在连接或字符串构建期间使用 StringBuilder 而不是 String 的好处

问题描述

这是我正在研究的 C# 中的字符串反转方法:

string s = "This is the way it is.";
string result = string.Empty;   

for(int i = s.Length-1; i <= 0; i--)
{   
    result = result + s[i];  
}    
return result; 

假设字符串可以变得非常非常长。为什么在这种情况下使用比使用如上所示Stringbuilder连接结果更有益?s[i]

是不是因为结果和s[i]都是不可变的字符串,因此每次查找它们时都会创建一个对象?导致创建大量对象并且需要垃圾收集所有这些对象?

提前感谢您的时间。

标签: c#stringimmutabilitystringbuilder

解决方案


不。不是他们两个。在这种情况下,两个字符串都是不可变的。但是,查看 for 循环, result创建了一个新的 String 对象,但不是s字符串对象,因为它没有被更新,我们只是在访问它。分配后立即,我们有前一个result对象无法进行垃圾收集,因为它正在丢失引用但不是s字符串对象。在下一次迭代中,当前新的resultString 对象将被垃圾收集等等。如果你使用过字符串生成器,你会有不同的情况。

 result = result + s[i];

与字符串不同,stringbuilder 是可变的。因此,如果您的result变量是 Stringbuilder 类型,则result不会创建新对象,而是会根据分配更新现有对象。


推荐阅读