61

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

我有几个选择:

if (dateTime == default(DateTime))

或者

if (dateTime == DateTime.MinValue)

或使用可为空的DateTime?

if (nullableDateTime.HasValue)

我个人更喜欢第三版,因为它的可读性很好。但是在我们的数据库中,我们有一些日期时间列被定义为非空。所以在某些情况下,我必须选择前两个选项。

我在某处读到default在使用泛型时应该使用关键字,但在这种情况下它不是更具可读性吗?当使用第二个选项时,我必须知道一个新的空 DateTime 实例的默认值是 DateTime.MinValue ,它对我来说具有实现细节的味道。

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

4

4 回答 4

72

我可能会说得很清楚:

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

好的,所以我会让这个名字稍微不那么冗长,但你明白我的意思。你如何初始化那个值并不重要——很清楚你想要做什么。

(当然,任何时候都可以使用可为空的类型。我假设这个问题被问到是因为在某些情况下你不能这样做。)

于 2013-04-29T14:49:55.453 回答
20

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

您几乎已经描述了需要Nullable<DateTime>. 我会选择那个选项。

(如果您需要将值保留到非空 db 列,您显然需要某种翻译层,但我会尝试将任何“魔术”值尽可能靠近 db,并尝试保持您的 C# 代码干净且惯用。)

于 2013-04-29T14:50:38.413 回答
9

“最佳”做法是使用 nullable DateTime。可空值类型正是出于不信任“幻数”的原因而创建的。

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

于 2013-04-29T14:51:48.120 回答
0

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

于 2013-04-29T14:56:36.613 回答