在串联或构建字符串期间使用StringBuilder而不是String的好处

时间:2018-08-10 16:24:12

标签: c# string immutability stringbuilder

这是我正在研究的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]进行级联的好处?

是因为result和s[i]都是不可变的字符串,因此每次查找它们都将创建一个对象吗?导致要创建很多对象,并且需要对所有这些对象进行垃圾回收吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

否。并非两者都。在这种情况下,两个字符串都是不可变的。但是,在for循环中,将创建一个新的result字符串对象,但不会创建s字符串对象,因为它没有被更新,我们只是在访问它。分配后,我们立即将前一个result对象用于垃圾回收,因为它失去了引用,但没有s字符串对象,因此无法进行垃圾回收。在下一个迭代中,将对当前新的result String对象进行垃圾收集,依此类推。如果您使用过字符串生成器,则会遇到不同的情况。

 result = result + s[i];

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

答案 1 :(得分:0)

StringBuilder是可变的。意味着在修改它时不会创建新对象。 您可以在此page

中阅读更多内容