如何检查默认的 DateTime 值?

70

我需要检查一个DateTime值是否有值。

我有几个选项:

if (dateTime == default(DateTime))
或者
if (dateTime == DateTime.MinValue)

或者使用可空的 DateTime?

if (nullableDateTime.HasValue)

就我个人而言,我更喜欢第三种版本,因为它非常易读。 但是在我们的数据库中,有一些日期时间列被定义为非空。 因此,在某些情况下,我必须使用前两个选项。

我在某个地方读到过,当使用泛型时应该使用default关键字,但在这种情况下,使用第二个选项是否更易读? 当使用第二个选项时,我必须知道新的、空的DateTime实例的默认值是DateTime.MinValue,这对我来说有一种实现细节的感觉。

那么,我应该使用哪个选项来使用“最佳实践”呢?


在代码块后的第一句话中,您是指“第二个版本”,还是指“第三个版本”? - Damien_The_Unbeliever
更新了 ;) 我的意思是第三个版本,因为该属性清楚地解释了我想要检查的内容:变量是否具有值。 - dasheddot
当实际发生的事件在那个最小日期发生时,会发生什么呢? - Servy
如果数据库具有非空日期字段,这是否意味着它始终具有有效日期(在这种情况下,我们不需要担心),还是它们使用某种默认值。如果是后者,您能否通过某种方式测试该默认值或者是由代码插入的?在这里,可为空性肯定是您应该使用的... - Chris
@Chris 不好的是,数据库设计了非空列,但业务逻辑允许无效或默认日期。因此在这些情况下,我们决定使用.Net的默认DateTime值来存储无效日期。但正如我所描述的,Nullable也是我最喜欢的选择,但在这些情况下,遗憾的是不可能。 - dasheddot
谁设计了数据库?你是否向维护整个系统的人反馈,表中的该字段应该是可空的? - Stewart
4个回答

81

我可能会把这个表达得非常明确:

// Or private, or maybe even public
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns
    = DateTime.MinValue;

好的,那么我会让名字稍微简洁一些,但你知道我的意思。初始化这个值的方式并不重要 - 你想做什么很清楚。

(当然,在任何可以使用可空类型的情况下都要使用可空类型。我假设问题是由于在某些情况下你不能使用可空类型而提出的。)


对于我的情况(无法调整数据库以支持可空的日期时间列),我不幸地需要放弃 Nullable。因此,您的建议是最可接受的,因为通过明确表示检查背后的业务规则,可以更容易地实现。我会选择这种方式。接受了,谢谢! - dasheddot
2
@dasheddot:我也会把这个逻辑放在你的数据层,并根据需要转换为 Nullable<DateTime>,这样你的其他所有代码都将使用漂亮的代码,而你只需要使用上面的检查一次。 - Chris

20
我需要检查一个`DateTime`的值是否有值。
你已经几乎描述了需要使用`Nullable<DateTime>`的典型情况。我会选择这个选项。
(显然,如果您需要将值持久化到非空db列中,则需要某种翻译层,但我会尽量将任何“魔法”值保持接近db,并尝试使您的C#代码清晰易懂。)

9

“最佳”做法是使用可空的DateTime。可空值类型正是为了不信任“魔术数字”而创建的。

这种方法最重要的是它的意图 - 在您的上下文中,拥有“默认”日期/时间是什么意思?


在我的情况下,这实际上意味着用户没有定义符合业务规则的日期。因此,我想可空类型可能是最好的选择,但不幸的是我不能修改数据库,只能坚持前两个版本。 - dasheddot

0
也许你可以在数据库中使用getdate()设置默认值,然后将所有空值更新为最小值或任何你喜欢的值。这样至少你就有一个条件了。

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