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