答案 0 :(得分:18)
日期的行为不像整数,我不记得代数的分类,但考虑到这一点:
Date + Span = Date
Date - Date = Span
Date + Date = undefined
Span + Span = Span
Span - Span = Span
任何特定年份,
10 feb + 10 days = 20 feb
20 feb - 20 jan = 31 days
20 jan + 20 feb = ???
当我们将Date视为Days-Since-StartDate时,最后的计算可能被解释为有意义。但是这个值和StartDate的选择一样随意。
答案 1 :(得分:12)
(作为数学家说)这是因为“日期”的算术运算没有关闭或定义明确,因此需要额外的结构。
例如,2000年1月1日 - 1999年12月1日= ......?我们知道他们之间有31天,但如果这被解释为日期,那么答案是大纪元(即零)+ 31天。这不再是有效的“日期”。
类似地,对整数的所有算术运算都没有很好地定义(1/2在整数中没有答案。整数数学在这里返回零,但是0 * 2 = 0,而不是你想象的1)。这需要一个我们称之为分数的附加结构。
答案 2 :(得分:12)
考虑这一点:整数可以概念化为绝对值(数字线上的点)或值之间的距离
根据你的逻辑,TimeSpan不是必要的:相反,它的DateTime是不必要的,可以被TimeSpan取代(从零开始的持续时间)。
另外还有一个事实是整数有一个明显的零,而日期却没有明显的零;但如果要将“数字线上的位置”替换为“距零/原点的距离/跨度”,则必须有明显的零。
编辑:
点(平面上的位置)与矢量不同。
他们看起来很相似......
...但是,如果原点发生变化,表示给定点所需的向量值将会改变。
添加两个(相对)向量总是有意义的;但是,添加两个点是没有意义的,除了将这些点转换为矢量然后添加矢量。
两个向量的总和不受原点变化的影响,但是如果通过将它们转换为向量并添加向量来对它们进行求和(因为更改原点),则两个点的总和将受到原点变化的影响会影响那些矢量的值。)
[在上面的参数中用TimeTime替换'point'和'vector'与'Time'。]
我认为绝对值和相对值之间存在真正的差异。我不知道为什么这种差异在算术中并不明显,即为什么“数字”似乎可以互换地用来表示绝对值和相对值。
答案 3 :(得分:5)
仅仅因为你可以定义一个操作并不意味着你应该。例如,除以零的原因之一是未定义,因为定义它需要牺牲一些非常有用的算术属性(例如,关联性等)。
时间跨度和日期之间的区别归结为添加。添加两个timepans是有意义的,但添加两个日期是没有意义的,除非你有一个任意的参考日期。通过不允许添加日期,您抽象出任意参考日期。我不知道.Net中的'0'是什么日期,我从来不需要知道。不是很好吗?
添加两个日期几乎总是一个错误(严肃地说,试着想一想除了数字命理之外这有什么意义)。通过引入时间跨度(创建Affine Space),您可以消除一整类错误。
答案 4 :(得分:4)
一个原因是分割类型会阻止您认为自己有相对时间但确实有绝对时间的一类错误,反之亦然。例如,如果两种类型是分开的,则可以将添加两个绝对时间标记为编译器错误。
此外,当成员数量较少时,IntelliSense(以及新手的发现)效果更好 - 通过在两种类型之间拆分方法,使用每种方法变得更容易。
答案 5 :(得分:2)
反过来问:在这方面弱化类型系统的好处是什么?
这都是成本与收益的问题,DateTime
通过禁止此类行为,可以减少由于不合逻辑的日期/时间计算导致的错误。 DateTime
存在的原因与首先存在严格的类型检查系统的原因相同:在代码中产生语义错误会产生编译时消息。通知程序员代码中的错误。
相反,有DateTime
:zilch。
现在考虑放弃DateTime
。我们会得到什么?
直接回答你的问题:“不是TimeSpan
多余的?”绝对不是,它可以减少错误。对我来说肯定有。
答案 6 :(得分:2)
从概念上考虑它。如果我告诉你我将在7天后参加一个派对,那句话中的“7天”就是约会。我可以说我的派对是7天吗?当然不是,因为7天不是约会。面向对象编程的一个关键思想是在系统中将类似的概念表示为类型。确实,我们可以将所有东西都表示为一个整数(事实上,很多人已经拥有和做过),但在面向对象编程中,我们有项目类型的概念,以及它们的行为和属性,从这个意义上讲,它使得有一个表达这个的对象。
答案 7 :(得分:0)
我认为你可以提出相反的论点DateTime
是多余的,我们应该只有TimeSpan
:)
说真的,所有日期都只是时间跨度。它们都与一些起点有关。从技术上讲,在基督教日历中没有“零年”(因为你不能真正拥有“我们领主的第一年”),但是如果我们分配在上午12点。公元0001年1月1日作为“零点”,那么之后(或之前)的每个日期都可以被认为是相对于该日期。所以,上午12点。在2009年9月19日,TimeSpan将为734033天。
因此,数学,DateTime
和TimeSpan
是多余的。但是当我们编写代码时,我们试图传达的不仅仅是抽象的数学结构。任何给定的DateTime
实例实际上可能只是相对于某个任意零点的时间跨度,但对于大多数阅读代码的人来说,它将暗示日历上的特定点。同样,TimeSpan
意味着日历上两点之间的差距。
在这种情况下,微软选择清晰而不是简约。我不能说我不同意这个决定。
答案 8 :(得分:0)
日期有很多并发症,例如:
将日期和TimeSpans视为不同的事物意味着这些问题在实践中不太可能让您感到困惑。
答案 9 :(得分:-1)
它的糖不多或少......