如果我在一个名为“TimeLastAccessed”的类上有一个DateTime,那么这个DateTime可以为空是否更有意义:
public DateTime? TimeLastAccessed { get; set }
if (TimeLastAccessed == null) // ... handle it
表示从未访问过或检查DateTime.MinValue
public DateTime TimeLastAccessed { get; set; }
if (TimeLastAccessed == DateTime.MinValue) // ... handle it
答案 0 :(得分:12)
使用Nullable更有意义。这就是Nullable的想法 - 表示值类型没有有效值。使用MinValue是一个补丁,用于没有Nullable的情况。
答案 1 :(得分: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) ...
而不是Nullable<DateTime>
:
if (item.ExpiryDate.HasValue && item.ExpiryDate <= DateTime.Today) ...
答案 2 :(得分:0)
如何存在永远不会被访问的东西?你的财产真的是列出LastAccessDateByCustomerOrClient吗?
在你的情况下,我认为你想要...测试中的HasValue而不是== null。如果您打算使用该课程,请充分利用课程的功能。它可能编译成几乎相同的代码,但......