这是我正在研究的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]
都是不可变的字符串,因此每次查找它们都将创建一个对象吗?导致要创建很多对象,并且需要对所有这些对象进行垃圾回收吗?
感谢您的时间。
答案 0 :(得分:0)
否。并非两者都。在这种情况下,两个字符串都是不可变的。但是,在for循环中,将创建一个新的result
字符串对象,但不会创建s
字符串对象,因为它没有被更新,我们只是在访问它。分配后,我们立即将前一个result
对象用于垃圾回收,因为它失去了引用,但没有s
字符串对象,因此无法进行垃圾回收。在下一个迭代中,将对当前新的result
String对象进行垃圾收集,依此类推。如果您使用过字符串生成器,则会遇到不同的情况。
result = result + s[i];
与字符串不同,stringbuilder是可变的。因此,如果您的result
变量是Stringbuilder的类型,则不会创建新的result
对象,而是根据分配更新现有的对象。
答案 1 :(得分:0)
StringBuilder是可变的。意味着在修改它时不会创建新对象。 您可以在此page
中阅读更多内容