为什么Date结构是不可变的?

时间:2012-12-12 00:21:31

标签: c# objective-c

我想知道为什么日期结构&对象,比如C#的DateTime& Obj-C的NSDate已经变得一成不变。

我正在寻找这种设计背后的原因以及使这些信息不可变的好处,而不只是“因为他们可以”

更新: 似乎有一个类似的问题,我的答案很棒,但专门针对Java,可以在这里找到:Why do we need immutable class?

与我的问题的答案相结合,提供了非常丰富的信息

4 个答案:

答案 0 :(得分:7)

不变性使得很多事情变得更容易。如果您不必担心某些事情可能会在您下面发生变化,那么您就不必编写许多保护代码。你不必做很多假设。事情有很多可能性,不会出错。

字符串,日期和其他类型的公共对象在现代语言中是不可变的,因为它简化了编译器,框架,并且意味着编译器在进行优化时可以自由地做出假设。

要点是,只需很小的代价(如果你想改变价值就必须创建一个新对象),你会获得很多真正的性能,稳定性和可靠性。

答案 1 :(得分:0)

我不确定Objective C,但在C#中,日期由简单的数字类型支持。并且由于数字是不可变的,因此基于它的Date也是如此。

答案 2 :(得分:0)

我不确定Objective-C,但DateTime是不可变的,因为使它们变得可变实际上很难正确地做到。

这是因为如果从方法(包括属性)返回它们,则会获得副本,而不是原始副本。这可能意味着以下代码无法正常运行:

someObject.Timestamp.SetSeconds(10.0);

SetSeconds无效且变异基础结构。

它什么都不做,因为你会获得Timestamp对象的副本,向它添加10秒,然后对该副本不做任何操作。

答案 3 :(得分:0)

为在.net中使用而编写的绝大多数(99.99%)结构(无论是在框架中还是在用户代码中定义)要么代表固定的独立值集合,它们可以接受对其合法的值的任何组合。类型(例如Point,其中包含XY),或者表示单个抽象实体。微软在.net中的结构使用指南未能区分这些不同的使用场景,假设所有结构都符合第二种模式,不幸的结果是第一种类型的结构通常以一种非常适合第二种类型的方式编写。 。但事实上,.net中的DateTime结构肯定不符合独立值的集合,因此指南完全适用于它。

首先,DateTime没有任何好方法可以直接暴露任何字段。 DateTime结构封装没有明确的独立值集,因此不清楚任何字段的类型应该是什么。此外,许多属性不能明显地变异,因为它们不是独立的;例如,如果有一个代表2012年2月29日的DateTime,并且将一年设置为2011年,然后将月份设置为3,那么结果日期应该是多少?只使用方法改变DateTime是有意义的,不幸的是vb.net和C#都假装允许在只读结构实例上调用变异方法,通过静默替换像MyList[3].MutatingMethod();这样的代码与可怕的var temp=MyList[3]; temp.MutatingMethod();。对于Microsoft来说,通过定义一个属性来解决这个问题应该相当简单,这样在一个只读实例上调用一个标记有该属性的方法会导致编译器错误而不是破坏代码,但不幸的是,微软的语言人员宁愿声明可变结构是邪恶的,而不是修复语言,所以它们不会,