An answer to this question提到immutable
的{{1}}特征有助于实现字符串实习。
任何人都可以解释不可变的特征如何帮助实现实习?
答案 0 :(得分:5)
如果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!
答案 1 :(得分:2)
具有相同值的字符串可以将引用到相同的实习字符串对象。如果您可以更改实习字符串,则更改将反映在使用实习字符串的每个位置。类似的东西:
string foo = "bats";
string bar = "bats";
foo[0] = 'c';
Console.WriteLine(bar); // cats
当然,他们可以在写作时不受限制,但为什么要这么麻烦?要做到这一点,实际上有一个选项,通过添加一堆不值得的编译器特殊情况稍微改进:覆盖字符串的下标运算符并确保每个变异方法取消对字符串的插入,有效地将字符串转换为{{ 1}}额外开销。字符串使用很多;这可能有点慢。
非实习生所需的复制意味着与将字符串传递给List<char>
或StringBuilder
相比,没有任何性能优势。至于可读性和易于理解:显式优于隐式。