0

更具体地说,我有 DateTime?出生日期

我的问题是在这种情况下会发生什么:

lblBirthDate.Text = myObject.BirthDate.GetValueOrDefault().ToString();

如果 BirthDate 为空。我安装了 resharper,它并没有警告我那里可能有一个空问题......

4

3 回答 3

6

如果BirthDatenull,您将获得 的默认实例的本地化字符串表示形式DateTime。也就是说,您将获得 0001 年 1 月 1 日 00:00:00.0000000 的字符串表示形式。

您没有收到 ReSharper 的警告,因为那里没有 null 问题。调用. Nullable<T>.GetValueOrDefault_ Nullable<T>相反,如果您有一个空实例,您将获得默认值。这正是GetValueOrDefault意味着:获取Valueif HasValueis true,否则获取底层结构类型的默认值。

于 2012-05-07T15:59:30.407 回答
2

我很确定在 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
于 2012-05-07T16:01:10.453 回答
0

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;

于 2012-05-07T17:05:33.597 回答