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