众所周知,String是不可变的。String不可变以及将StringBuilder类引入可变的原因是什么?
out
ref
string x = "abc"
x == "abc"
"abc" == "ab" + "c"
Christmas.AddMonths(1)
DateTime
return this
总而言之,对于没有发生变化的对象来说,保持不变是有很多好处的。主要缺点是需要额外的构造,尽管即使在这里它也常常被夸大了(请记住,在StringBuilder变得比等效串联系列及其固有构造更有效之前,您必须进行几次附加操作)。
如果可变性是对象(希望由永远不会改变其薪水的Employee对象建模)目的的一部分,那将是一个不利条件,尽管有时甚至可以使用(在许多Web和其他无状态环境中)应用程序,执行读取操作的代码与执行更新操作是分开的,并且使用不同的对象可能是很自然的- 我不会使对象成为不可变的,然后强制使用该模式,但是如果我已经拥有该模式,则可以使我的“读取”对象对于性能和正确性保证收益而言是不变的)。
写时复制是中间立场。此处,“真实”类包含对“状态”类的引用。状态类在复制操作上共享,但是如果更改状态,则会创建状态类的新副本。C 比C#更常与C 一起使用,这就是为什么它的std:string拥有不可变类型的一些(但不是全部)优点,同时仍然可变的原因。