使用DateTime.MinValue还是可空的DateTime更好?

13
如果一个类中有一个名为“TimeLastAccessed”的DateTime属性,将其设置为可空的是否更合理:
public DateTime? TimeLastAccessed { get; set }

if (TimeLastAccessed == null) // ... handle it

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

public DateTime TimeLastAccessed { get; set; }

if (TimeLastAccessed == DateTime.MinValue) // ... handle it

?


1
当对象最初创建时,TimeLastAccessed是否应该设置为TimeCreated? - benPearce
3个回答

15

使用可空类型(Nullable)更加合理。这就是可空类型的概念 - 表示值类型没有有效值。使用MinValue只是作为一种补丁,用于在没有可空类型的情况下解决问题。


这也太神奇了。如果有人想要表达DateTime.MinValue,那么它会被忽略。 - Ian

6

我认为在没有其他考虑因素的情况下,Nullable<DateTime>是更好的选择。

然而,你需要考虑需要与之交互的其他系统。

例如:

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

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

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

一种方法是使用一个表示"永不过期"的null的Nullable<DateTime>。另一种方法是使用标准的DateTime,其中DateTime.MaxValue表示"永不过期"。

在这个例子中,对于标准DateTime,"是否过期"的测试更简单:

if (item.ExpiryDate <= DateTime.Today) ...

对于 Nullable<DateTime> 来说,情况就不同了:

if (item.ExpiryDate.HasValue && item.ExpiryDate <= DateTime.Today) ...

0

如何存在的东西从未被访问?你的属性真的是像 LastAccessDateByCustomerOrClient 这样的列表吗?

而且在你的情况下,我认为你想要使用 ...HasValue 而不是在测试中使用 == null。如果你要使用这个类,就充分利用它的功能。它可能编译成几乎相同的代码,但是...


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