字符串的不变性如何帮助字符串实习

本文关键字:字符串 帮助 不变性 何帮助 | 更新日期: 2023-09-27 18:12:47

这个问题的答案提到stringimmutable特性有助于实现字符串实习

谁能解释一下不可变的特性如何帮助实现实习?

字符串的不变性如何帮助字符串实习

如果String是一个可变类型,它根本不能被拘禁。如果对象池可以被改变,那么保存它们就没有意义了……你不能指望你从池中得到的是你感兴趣的字符串(至少在你使用它的时候)。

想象:

string x = "foo";
string y = "foo";
// x and y are references to the same object...
x.MutateTo("bar"); // This doesn't change which object y refers to...
Console.WriteLine(y); // This would have to print "bar" - eek!

具有相同值的字符串可以引用到相同的内部字符串对象。如果您可以更改一个内部字符串,那么该更改将反映在使用该内部字符串的任何地方。比如:

string foo = "bats";
string bar = "bats";
foo[0] = 'c';
Console.WriteLine(bar); // cats

当然,它们可以在写的时候被取消,但是为什么要这么麻烦呢?要做到这一点,有一个有效的选择,通过添加一堆不值得的编译器特殊情况略微改进:覆盖字符串的下标操作符,并确保每个变化方法都取消对字符串的培训,有效地将字符串转换为List<char>,并增加额外的开销。字符串用得很多;这可能有点慢。

与将字符串传递给StringBuilderList<char>相比,unintern所需的复制没有性能优势。至于可读性和易理解性:显式比隐式好。