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

时间:2014-07-14 17:32:52

标签: c# string immutability

An answer to this question提到immutable的{​​{1}}特征有助于实现字符串实习

任何人都可以解释不可变的特征如何帮助实现实习

2 个答案:

答案 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相比,没有任何性能优势。至于可读性和易于理解:显式优于隐式。