更具体一点,我有DateTime?出生日期
我的问题是在这种情况下会发生什么:
lblBirthDate.Text = myObject.BirthDate.GetValueOrDefault().ToString();
如果BirthDate为null。我安装了resharper,并没有警告我,那里我可能有一个空问题......
答案 0 :(得分:6)
如果BirthDate
为null
,则会获得默认实例DateTime
的本地化字符串表示形式。也就是说,您将获得字符串表示形式为00:00:00.0000000,即0001年1月1日。
您没有收到ReSharper的警告,因为那里没有空问题。在Nullable<T>.GetValueOrDefault
的空实例上调用Nullable<T>
不是运行时异常。相反,如果您有一个null实例,则会获得默认值。这正是GetValueOrDefault
的意思:如果Value
是HasValue
,则获取true
,否则获取基础结构类型的默认值。
答案 1 :(得分:2)
我很确定GetValueOrDefault
在null的情况下返回DateTime.MinValue
。
以下是一些处理空值的方法:
DateTime? myNullDate = null;
DateTime myDate;
myDate = myNullDate ?? DateTime.Now; // myDate => DateTime.Now
myDate = myNullDate ?? default(DateTime); // myDate => DateTime.MinValue
myDate = myNullDate.GetValueOrDefault(DateTime.Now); // myDate => DateTime.Now
myDate = myNullDate.GetValueOrDefault(); // myDate => DateTime.MinValue
答案 2 :(得分:0)
Resharper不会显示任何错误,因为DateTime的默认值是1/1/1 00:00:00。您可以使用默认运算符获取任何类型的默认值:
DateTime defaultDateTime = default(DateTime);
此值与DateTime.MinValue
如果您需要使用空值,则必须将您的属性声明为可为空:
DateTime? BirthDay { get; set; };
可空的DateTime DateTime?
支持调用ToString()
,即使值为null也没有错误,如果是,则给出一个空字符串。然后你不必担心空值。
使用可为空的DateTime比使用特殊值表示缺失值更加一致,例如default(DateTime)
,即DateTime.MinValue;