可空类型作为属性

时间:2010-09-26 12:38:38

标签: c# datetime nullable

用这种类型构造我的对象实体是否可以?

   public class Patient
   {
        public Datetime? AdmissionDate { get; set; }
        public double? AdmissionFee { get; set }
        public int? RoomNumber { get; set }
    }

如果我在所有实体中实现这一点,那么缺点是什么,因为最近,我总是遇到需要将值设置为null的情况,特别是在DateTime中。我当前的解决方案是DateTime.MinValue从数据库中获取null datetimes记录时,当我将结果显示给Ui时,我只是像这样检查它。

    if (patient.AdmissionDate == Datetime.MinValue)
    {
         DisplayAdmissionDate(string.empty)
    }
    else
     {
        DisplayAdmissionDate(patient.AdmissionDate)
    }

是的,在gridview中,我必须将它放在Databound事件上,所以当我有数百万个数据要显示时,我认为检查每个日期时间的每个循环都不是最优雅的方式所以,对于这个问题,我发现这个 ?键入我可以放置空值的类型,并且我打算编写所有属性,因此将来,将null值放入此值类型将不会成为问题。任何建议家伙? TIA

5 个答案:

答案 0 :(得分:4)

这是没有单一的教条回答涵盖所有案例的情况之一。

总是使用可空类型(或总是避免它们),你无法逃脱。你应该考虑每个案例并使用你真正需要的案例。

你提到你经常需要一个可以为空的DateTime。那么为什么你不能在这些情况下使用DateTime? ?这应该是所有其他领域的独立考虑因素,尤其是int s。

可空类型中的null值旨在表示该值类似于未指定,不可用或未知。存在这种概念的情况很多(例如,网站上的用户可能会或可能不会指定他们的出生日期,因此应该是DateTime?),但也有很多情况这个概念没有意义(例如,列表中的项目数 - 如果列表本身不为空,则显然它具有确定数量的项目,因此应该是int,而不是int?。)

答案 1 :(得分:1)

对象始终应包含至少一个不可为空的ValueType作为主键。在您的情况下,您应该使用

public int ID {get;set;}

执行此操作,您始终可以识别对象。其余属性可以为空。

对nullable的检查完全没问题,除非GridView已经可以检测到它。为此目的准确引入了可空类型,允许ValueType将null作为值。性能方面应该是最小的,并不是以任何方式复杂,并且优化它将是过早优化的情况。

如果您想了解有关Nullable<T>的实施的更多信息,请查看here(遗憾的是,原始页面目前已关闭,因此网络摄像头版本必须足够。代码可读但是,只是博客帖子已被破坏了。)

答案 2 :(得分:0)

可空类型的缺点是你必须经常检查它们是否有价值才能操作它们......

if(AdmissionFee.HasValue) total += AdmissionFee;

而不仅仅是

total += AdmissionFee;

答案 3 :(得分:0)

您可能会遇到数据绑定问题,我认为WinForms不会很好地应对,因为它早于可以为空的类型。

如果一个项目在现实生活中可以为null,那么可空类型是一个很好的解决方案,因为它清楚了。但是,不要只是为了它而使用它们。

答案 4 :(得分:0)

根据https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/property?redirectedfrom=MSDN

避免从属性获取器中抛出异常。

由于SomeNullableProperty.Value可以抛出NullReferenceException,所以我想说,您至少应该在getter中包含逻辑以确保有默认值。