如何检查默认的DateTime值?

das*_*dot 50 .net c# design-patterns

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

我有几个选择:

if (dateTime == default(DateTime))
Run Code Online (Sandbox Code Playgroud)

要么

if (dateTime == DateTime.MinValue)
Run Code Online (Sandbox Code Playgroud)

或使用可空的 DateTime?

if (nullableDateTime.HasValue)
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢第三个版本,因为它的可读性非常好.但是在我们的数据库中,我们有一些datetime列,它们被定义为非null.所以在某些情况下我必须选择前两个选项.

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

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

Jon*_*eet 54

我可能会说这个非常明确:

// Or private, or maybe even public
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns
    = DateTime.MinValue;
Run Code Online (Sandbox Code Playgroud)

好吧,所以我的名字稍微不那么罗嗦了,但你明白我的意思.如何初始化该值并不重要 - 很明显您正在尝试做什么.

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

  • @dasheddot:我也会把这个逻辑放在你的数据层中,并根据需要转换为Nullable <DateTime>,这样你的代码就可以使用其他地方的代码而你只需要使用上面的检查一次. (2认同)

Luk*_*keH 18

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

你已经非常多地描述了需要的教科书情况Nullable<DateTime>.我会选择那个选项.

(如果你需要将值保存到非空的db列,你显然需要某种转换层,但我会尽量保持任何"魔法"值尽可能接近db,并尽量保持你的C#代码干净且惯用.)


Iga*_*nik 7

"最佳"做法是使用可空的DateTime.由于不信任"魔术"数字的原因,创建了可以为空的值类型.

这种方法最重要的是它的意图 - 在你的上下文中具有"默认"日期/时间意味着什么?