我正在设计一个具有私人消息系统的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
来查询未读邮件。
但是,使用可空类型至少涉及代码中的装箱和拆箱,性能会下降。另一方面,查询未读消息意味着比较值(但可以将其编入索引)
您建议的方法是什么?在这种情况下,最佳做法会有什么建议?
答案 0 :(得分:17)
使用DateTime?
。其具体目的是避免使用保留值(又称“幻数”)来表示特殊情况,例如null
。
此外,使用可空类型不会引入任何拳击本身。任何已装箱的值仍然是,但你不会简单地通过切换引入任何拳击。 Nullable<T>
类型实际上是一个结构,并且与null
(或VB.NET中的Nothing
)进行比较的能力严格来说是一种语言约定。在封面下,它被转换为对HasValue
属性的检查。
答案 1 :(得分:7)
与其他方法相比,使用可空类型并未显着“降低性能”。 DateTime
和DateTime?
都是结构,这里没有拳击。使用可空是正确的选择。
答案 2 :(得分:3)
在处理数值时问自己同样的问题。我用0吗?如果0有实际意义怎么办? NULL是没有价值的。 100次中的99次,使得代码的意图最明显。就性能而言,即使存在性能,与您自己的代码所存在的性能问题相比也会显得苍白无力。
答案 3 :(得分:0)
正如马克和亚当所说,可以采用可空类型。您不会看到性能损失,它将使查询更加简单。
答案 4 :(得分:0)
如果你担心在客户端代码中使用可空类型,你可以将它设置为DateTime.MinValue
,然后在商务层中,切换到可以为空。然后,您可以将可空类型提供给DataAccess。这有助于为使用nullables保留一层abstarction。
答案 5 :(得分:0)
我错过了一招吗?
class Message
{
DateTime LastRead;
bool Read;
}