DateTime.MinValue 与 C# 中的新 DateTime()

Posted

技术标签:

【中文标题】DateTime.MinValue 与 C# 中的新 DateTime()【英文标题】:DateTime.MinValue vs new DateTime() in C# 【发布时间】:2011-01-28 00:44:07 【问题描述】:

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

DateTime varData = sqlQueryResult["Data"] is DateTime ? (DateTime) sqlQueryResult["Data"] : new DateTime();

【问题讨论】:

【参考方案1】:

来自the documentation of DateTime.MinValue:

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

因此,生成的日期将是相同的。因为DateTime 是一个值类型,所以两个选项应该是等价的。就个人而言,我更喜欢写DateTime.MinValue,因为它是自我记录的。

PS:如果您的数据可以包含(有意义的)空值,您可能需要考虑使用nullable types (DateTime?)。

【讨论】:

【参考方案2】:

通常,我会明确处理NULL 的情况。大致如下:

if (!sqlQueryResults.IsNull("Data"))
    DoComputationDependantOnDateTime((DateTime) sqlQueryResults["Data"]);

在某些情况下,即使不存在数据,执行逻辑也可能有意义。在这种情况下,只有您知道从什么默认值开始。可能的候选人:

DateTime.MinValue DateTime.MaxValue DateTime.Now

我永远不会使用new DateTime(),因为它的可读性很差。该语句返回什么?您(以及该项目的未来开发人员)可能需要查看文档以了解初始化的值。

【讨论】:

【参考方案3】:

我会说始终使用 MinValue,因为这样您就可以确切地知道其中的值是什么。当您简单地使用 new DateTime() 时,您正在初始化它以保存一个值,但没有指定要放入其中的值。明确地将值放入其中也更加清晰明了。

【讨论】:

new DateTime() 实际上将它设置为一个值。它基本上是'default(DateTime)',它是根据为结构构造默认值的规则设置的。 IE。为所有成员设置默认值。【参考方案4】:

DateTime 的默认值DateTime.MinValue,所以我想你使用哪个并不重要;)

【讨论】:

【参考方案5】:

没有“正确”的方式。人们建立了一个约定,团队遵循。

DateTime.MinValue 和 new DateTime() 是 null 的有效定义,如果负责的开发人员确定的话。

【讨论】:

【参考方案6】:

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

(null值当然也需要特殊处理,但更难忽视。)

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

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

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

【讨论】:

不会编译 - “类型 'System.DateTime' 不能声明为 const”

以上是关于DateTime.MinValue 与 C# 中的新 DateTime()的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 Winforms DateTimePicker 设置为 DateTime.MinValue 会失败?

TimeZoneInfo.ConvertTime在DateTime.MinValue上非常慢

在DateTime中,仅使用64位中的62位。负值不在规范中。我如何表示BC的日期?

SQL SERVER2005数据库有个字段以datetime类型允许为空 在C#怎么样把这个时间字段赋为null

将数据表中的所有 DateTime 列转换为 SqlDateTime 列

DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题