C#中的DateTime.MinValue和new DateTime()有什么区别?

12

在获取SQL DateTime时,Resharper建议当值为DBNull.Value时使用new DateTime()。我一直使用DateTime.MinValue。哪种方式是正确的?

DateTime varData = sqlQueryResult["Data"] is DateTime ? (DateTime) sqlQueryResult["Data"] : new DateTime();
6个回答

20

来自DateTime.MinValue文档:

MinValue定义了未初始化的DateTime变量的日期和时间。

因此,结果的日期将是相同的。由于DateTime是值类型,两种选项应该是等价的。个人倾向于编写DateTime.MinValue,因为它具有自我说明性。

注:如果您的数据可能包含(有意义的)null值,则考虑使用可空类型DateTime?)。


2
通常情况下,我会明确处理NULL情况。大概是这样处理的:
if (!sqlQueryResults.IsNull("Data"))
    DoComputationDependantOnDateTime((DateTime) sqlQueryResults["Data"]);

在某些情况下,即使没有数据出现,执行逻辑也可能是有意义的。在这种情况下,只有您知道从哪个默认值开始。可能的选择如下:
  • DateTime.MinValue
  • DateTime.MaxValue
  • DateTime.Now
我绝不会使用new DateTime(),因为它的可读性非常差。这条语句返回什么?您(以及将来参与此项目的开发人员)可能需要查阅文档才能确定其初始化值。

1
我会建议始终使用MinValue,因为这样你就知道它里面确切的数值是什么。当你只是使用new DateTime()时,你初始化了一个变量来保存数值,但没有指定要放入什么数值。明确地将一个数值放入其中也更加简洁和清晰。

1
new DateTime() 实际上是将其设置为一个值。它基本上是 'default(DateTime)',根据构造结构的默认值规则进行设置。即设置所有成员的默认值。 - kervin

1

DateTime的默认值DateTime.MinValue,所以我猜你使用哪个都无所谓 ;)


0

表示空值的最可维护方式是使用Nullable<DateTime>,即DateTime?。这样,空值就清晰地表示为非值,而不是需要特殊处理的魔法值。

(当然,空值也需要特殊处理,但很难忽略。)

如果使用魔法值来表示空值,则没有任何值比其他值更好。您可以使用DateTime.MinValuenew DateTime()(它们给出相同的结果),或者您可以使用任何超出应用程序使用范围的任意值。

像DateTime.MinValue这样的值具有轻微优势,因为它已经定义为常量,另一方面,您可以定义自己的常量,其名称稍微更好,例如:

public const DateTime DateThatMeansNull = new DateTime(1685, 3, 21);

无法编译 - “无法将类型'System.DateTime'声明为const” - Ryan

0

没有所谓的“正确”方式。有一种人们设定的约定,团队遵循这个约定。

如果负责开发的人决定如此,DateTime.MinValue和new DateTime()是有效的对null的定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接