如果默认值为 null 并转换为字符串,会发生什么情况

本文关键字:什么情况 转换 默认值 null 如果 字符串 | 更新日期: 2023-09-27 18:33:21

更具体地说,我有日期时间?生日

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

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

如果出生日期将为空。我已经安装了锐化器,它并没有警告我那里可能有空问题......

如果默认值为 null 并转换为字符串,会发生什么情况

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

您不会收到来自 ReSharper 的警告,因为您那里没有空问题。在Nullable<T>的空实例上调用Nullable<T>.GetValueOrDefault不是运行时异常。相反,如果您有空实例,您将获得默认值。这正是GetValueOrDefault的意思:如果HasValue true,则获取Value,否则获取底层结构类型的默认值。

我很确定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

Resharper 不会显示任何错误,因为 DateTime 的默认值为 1/1/1 00:00:00。您可以使用默认运算符获取任何类型的默认值:

DateTime defaultDateTime = default(DateTime);

此值与DateTime.MinValue完全相同

如果需要使用 null,则必须将属性声明为可为 null:

DateTime? BirthDay { get; set; };

可为 null 的 DateTime DateTime?支持调用ToString()而不会出错,即使值为 null,如果是,则给出空字符串。然后,您不必担心空值。

使用

可为空的日期时间比使用特殊值来表示缺失值(如default(DateTime))更一致,即 DateTime.MinValue;