这是我正在研究的 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]
都是不可变的字符串,因此每次查找它们时都会创建一个对象吗?导致创建大量对象并需要对所有这些对象进行垃圾回收?
提前感谢您的时间。
NO.不是他们两个。在这种情况下,这两个字符串都是不可变的。但是,在 for 循环中查找,创建了一个新的result
String 对象,但没有创建s
字符串对象,因为它没有更新,我们只是在访问它。赋值后,我们立即使前一个result
对象难以辨认以进行垃圾回收,因为它丢失了引用s
而不是字符串对象。在下一次迭代中,当前新的result
String 对象将被垃圾回收,依此类推。如果使用字符串生成器,则会遇到不同的情况。
result = result + s[i];
与字符串不同,字符串生成器是可变的。 因此,如果您的result
变量类型为 Stringbuilder,则不会创建新的result
对象,而是会根据赋值更新现有对象。
StringBuilder 是可变的。这意味着它在修改时不会创建新对象。 您可以在此页面阅读更多内容