使用DateTime.MinValue或可以为空的DateTime更好吗?

Ker*_*mit 11 c# datetime

如果我在名为"TimeLastAccessed"的类上有一个DateTime,那么这个DateTime可以为空是否更有意义:

public DateTime? TimeLastAccessed { get; set }

if (TimeLastAccessed == null) // ... handle it
Run Code Online (Sandbox Code Playgroud)

表示从未访问过或检查DateTime.MinValue

public DateTime TimeLastAccessed { get; set; }

if (TimeLastAccessed == DateTime.MinValue) // ... handle it
Run Code Online (Sandbox Code Playgroud)

Ari*_*iel 12

使用Nullable更有意义.这就是Nul​​lable的想法 - 表示值类型没有有效值.使用MinValue是一个补丁,用于没有Nullable的情况.


Joe*_*Joe 6

我同意在没有其他考虑因素的情况下Nullable <DateTime>是更好的选择.

但是,您需要考虑需要与之互操作的其他系统.

例如:

  • 如果要将.NET DateTime暴露给COM客户端,则无法使用Nullable <DateTime>.

  • 如果要将值存储在SQL Server数据库中,请记住SQL Server无法将DateTime.MinValue存储为DateTime.

需要考虑的另一点是Nullable可以为API的调用者增加一些复杂性:他们可能需要考虑如何处理null case.在某些情况下,使用null情况的默认值可能更简单.例如,考虑一个公开属性"ExpiryDate"的类,其中需要一个值来指示该项永不过期.

一种方法是使用Nullable<DateTime>带有表示"永不过期"的null.另一种方法是使用标准的DateTime来DateTime.MaxValue表示"永不过期".

在此示例中,标准DateTime的"过期"测试更简单:

if (item.ExpiryDate <= DateTime.Today) ...
Run Code Online (Sandbox Code Playgroud)

而不是Nullable<DateTime>:

if (item.ExpiryDate.HasValue && item.ExpiryDate <= DateTime.Today) ...
Run Code Online (Sandbox Code Playgroud)