可能重复:
日期时间“空”值
C# 中有许多不可为 Null 的内置类。例如,日期时间,有时我想检查我的数据时间对象是否为空,但我不允许。如何将可空性插入到 datetime 类?
C# 中有许多不可为 Null 的内置类。
它们(Datetime
)是值类型的结构,而不是类,因此不可为空。
与引用类型不同,值类型不能包含空值。但是,可空类型功能确实允许将值类型分配给空。
您可以使用Nullable<T>
withDateTime
使其可以为空。
DateTime? dateTimeObject = null;
问号使其可以为空?
。DateTime
语法 T? 是 Nullable 的简写,其中 T 是值类型。这两种形式可以互换。
简而言之,结构是值类型。值类型必须始终有效(因此必须初始化结构构造函数中的所有成员)并且不能为空。
然而,有一个作弊;
您可以使用Nullable<T>
, 否则可用于"T?"
将值类型包装在可以为空的引用中。
用法:
DateTime? foo = new DateTime(...);
foo.Value.<datetime member>
?
您可以在类型末尾添加字符:
DateTime? date;
当然,您可以通过更改声明使整数、双精度、日期时间等为空。
DateTime? dt = null.
但
您需要注意两件事。
1)日期时间?和 DateTime 不是相同的数据类型,因此,如果您执行以下操作:
DateTime? date1 = null;
date1 = DateTime.Now;
DateTime date2 = date1; // Wont work.
访问可为空类型的值的正确方法是这样的:
DateTime date2 = date1.Value;
2)第二个但是,您需要始终检查是否有值,然后才能使用它。
DateTime? date1 = null;
DateTime date2 = date1.Value;
这将抛出一个异常,“可空对象必须有一个值”。
所以并不是添加可空运算符那么简单,每次要使用变量时都需要检查属性“HasValue”:
DateTime? date1 = DateTime.Now;
if(date1.HasValue)
{
DateTime date2 = date1.Value;
}
明智地使用可空值。
严格来说,DateTime
是 a struct
(即value-types),而不是 a class
(它们是引用类型),这就是它不可为空的原因。Nullable<DateTime>
, akaDateTime?
是可以为空的,但是。Nullable<T>
是编译器对它进行了特殊处理,使其在, (via ) 和大多数其他操作(通过所谓的“提升运算符”)struct
方面的工作方式与您期望的非常相似。==
!=
.HasValue
DateTime
是一个struct
,所以它是value types
。值类型不能是null
. 除非您可以使用nullable types
forDateTime
或其他值类型;
Nullable 类型是 System.Nullable 结构的实例。可空类型可以表示其基础值类型的正确值范围,外加一个额外的空值。
可空类型用问号表示?
。例如;
DateTime? date = null;
DateTime?
顺便说一句,相当于System.Nullable<DateTime>
。
如果你使用 nullable DateTime
,你可以检查它是否有值;
if(date.HasValue == true)
当然,您可以将它们与等式运算符一起使用,例如==
and!=