自定义不可变类

时间:2014-08-04 07:12:51

标签: c# .net immutability

1)是否只有引用类型对象(例如:string)可以是不可变的?如果没有,请提供一些样品吗?

2)据我所知,如果注入到类中的所有信息都是在构造函数或工厂方法中提供的,则类是不可变的。 是否所有类中使用的项本身都应该是不可变的,以便创建一个自定义的不可变类?

注意:请不要通过指出其他一些未明确回答我问题的问题来将问题标记为重复。

1 个答案:

答案 0 :(得分:0)

不,我认为你误解了。

不变性的本质是你正在处理价值观,这些价值观只有价值而且没有身份。对于一个可变的对象,它必须在概念上具有一个在其值发生变化时能够存活的身份。

因此,.NET中的值类型本质上是不可变的,因为它们是值。数字7,浮点数1.3e17和日期1/1/1901是不可变的。保存这些值的变量可能是可变的,但值本身不是。

字符串也是不可变的。值“abc”是不可变的,即使它恰好保存在引用类型中。字符串没有标识,可以自由复制。

.NET中的结构是值类型,并在赋值时复制。这是您所期望的,因为复制值不会创建新实体。它只是相同值的副本。

.NET框架不会强制实现用户定义类型的不变性。你必须自己做。您应该考虑您创建的类型是由其值标识还是具有标识,并相应地设计您的类和结构。为可变的可识别对象使用不可变值和类的结构是非常合理的,但这取决于您决定和执行。


记住变量与它们包含的值之间的区别非常重要。 String,DateTime或Point是值,StringBuilder或Stream不是。 String变量包含String值。 StringBuilder变量包含对StringBuilder的引用,而StringBuilder又包含String值。 Point变量包含一个Point值(碰巧有X和Y int组件)。变量是可变的,值不是。

当指定一个Point时,该值不会改变,但保持它的变量(LHS)会从旧值更改为新值。