更好的DateTime?或使用默认值(DateTime)为NULL?

时间:2011-01-27 20:36:30

标签: c# nhibernate

我正在设计一个具有私人消息系统的C#/ NHibernate网站。我希望管理员检查用户是否以及何时阅读了消息,并一起突出显示用户尚未阅读的消息。为了实现这两个目标,我找到了两个选择:

选项1

class Message
{
    DateTime? Read;
}

其中Read==null表示尚未阅读

选项2

class Message
{
    DateTime Read;
}

其中Read==default(DateTime)(1月1日公布,1:00,0:00:00)表示尚未阅读。

在大学时,我被教会使用NULL值处理所有特殊案例,并且使用可空类型似乎是一个很好的选择,因为看起来更容易通过检查是否为NULL来查询未读邮件。

但是,使用可空类型至少涉及代码中的装箱和拆箱,性能会下降。另一方面,查询未读消息意味着比较值(但可以将其编入索引)

我的问题是

您建议的方法是什么?在这种情况下,最佳做法会有什么建议?

6 个答案:

答案 0 :(得分:17)

使用DateTime?。其具体目的是避免使用保留值(又称“幻数”)来表示特殊情况,例如null

此外,使用可空类型不会引入任何拳击本身。任何已装箱的值仍然是,但你不会简单地通过切换引入任何拳击。 Nullable<T>类型实际上是一个结构,并且与null(或VB.NET中的Nothing)进行比较的能力严格来说是一种语言约定。在封面下,它被转换为对HasValue属性的检查。

答案 1 :(得分:7)

与其他方法相比,使用可空类型并未显着“降低性能”。 DateTimeDateTime?都是结构,这里没有拳击。使用可空是正确的选择。

答案 2 :(得分:3)

在处理数值时问自己同样的问题。我用0吗?如果0有实际意义怎么办? NULL是没有价值的。 100次中的99次,使得代码的意图最明显。就性能而言,即使存在性能,与您自己的代码所存在的性能问题相比也会显得苍白无力。

答案 3 :(得分:0)

正如马克和亚当所说,可以采用可空类型。您不会看到性能损失,它将使查询更加简单。

答案 4 :(得分:0)

如果你担心在客户端代码中使用可空类型,你可以将它设置为DateTime.MinValue,然后在商务层中,切换到可以为空。然后,您可以将可空类型提供给DataAccess。这有助于为使用nullables保留一层abstarction。

答案 5 :(得分:0)

我错过了一招吗?

class Message
{
    DateTime LastRead;
    bool Read;
}