更具体地说,我有 DateTime?出生日期
我的问题是在这种情况下会发生什么:
lblBirthDate.Text = myObject.BirthDate.GetValueOrDefault().ToString();
如果 BirthDate 为空。我安装了 resharper,它并没有警告我那里可能有一个空问题......
更具体地说,我有 DateTime?出生日期
我的问题是在这种情况下会发生什么:
lblBirthDate.Text = myObject.BirthDate.GetValueOrDefault().ToString();
如果 BirthDate 为空。我安装了 resharper,它并没有警告我那里可能有一个空问题......
如果BirthDate
是null
,您将获得 的默认实例的本地化字符串表示形式DateTime
。也就是说,您将获得 0001 年 1 月 1 日 00:00:00.0000000 的字符串表示形式。
您没有收到 ReSharper 的警告,因为那里没有 null 问题。调用. Nullable<T>.GetValueOrDefault
_ Nullable<T>
相反,如果您有一个空实例,您将获得默认值。这正是GetValueOrDefault
意味着:获取Value
if HasValue
is true
,否则获取底层结构类型的默认值。
我很确定在 null 的情况下GetValueOrDefault
返回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
Resharper 不会显示任何错误,因为 DateTime 的默认值为 1/1/1 00:00:00。您可以使用默认运算符获取任何类型的默认值:
DateTime defaultDateTime = default(DateTime);
这个值与DateTime.MinValue
如果您需要使用空值,则必须将您的属性声明为可为空的:
DateTime? BirthDay { get; set; };
可为空的 DateTimeDateTime?
支持调用ToString()
而不会出错,即使该值为 null,如果是,则给出一个空字符串。然后你不必担心空值。
使用可为空的 DateTime 比使用特殊值来表示缺失值更一致,例如default(DateTime)
,即DateTime.MinValue;