用这种类型构造我的对象实体是否可以?
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
答案 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中包含逻辑以确保有默认值。