1

可能重复:
日期时间“空”值

C# 中有许多不可为 Null 的内置类。例如,日期时间,有时我想检查我的数据时间对象是否为空,但我不允许。如何将可空性插入到 datetime 类?

4

7 回答 7

4

C# 中有许多不可为 Null 的内置类。

它们(Datetime)是值类型的结构,而不是类,因此不可为空。

MSDN - 值类型

与引用类型不同,值类型不能包含空值。但是,可空类型功能确实允许将值类型分配给空。

您可以使用Nullable<T>withDateTime使其可以为空。

DateTime? dateTimeObject = null;

问号使其可以为空?DateTime

语法 T? 是 Nullable 的简写,其中 T 是值类型。这两种形式可以互换。

于 2013-01-30T11:18:19.950 回答
4

简而言之,结构是值类型。值类型必须始终有效(因此必须初始化结构构造函数中的所有成员)并且不能为空。

然而,有一个作弊;

您可以使用Nullable<T>, 否则可用于"T?"将值类型包装在可以为空的引用中。

用法:

DateTime? foo = new DateTime(...);

foo.Value.<datetime member>
于 2013-01-30T11:25:05.060 回答
2

使用就足够了?,比如

DateTime? dt = null;

所以你的不可为空的类型变成了可空的类型

于 2013-01-30T11:18:14.713 回答
2

?您可以在类型末尾添加字符:

DateTime? date;
于 2013-01-30T11:19:24.183 回答
2

当然,您可以通过更改声明使整数、双精度、日期时间等为空。

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;
}

明智地使用可空值。

于 2013-01-30T11:27:10.493 回答
1

严格来说,DateTime是 a struct(即value-types),而不是 a class(它们是引用类型),这就是它不可为空的原因。Nullable<DateTime>, akaDateTime? 是可以为空的,但是。Nullable<T>是编译器对它进行了特殊处理,使其在, (via ) 和大多数其他操作(通过所谓的“提升运算符”)struct方面的工作方式与您期望的非常相似。==!=.HasValue

于 2013-01-30T11:18:44.423 回答
1

DateTime是一个struct,所以它是value types。值类型不能是null. 除非您可以使用nullable typesforDateTime或其他值类型;

Nullable 类型是 System.Nullable 结构的实例。可空类型可以表示其基础值类型的正确值范围,外加一个额外的空值

可空类型用问号表示?。例如;

DateTime? date = null;

DateTime?顺便说一句,相当于System.Nullable<DateTime>

如果你使用 nullable DateTime,你可以检查它是否有值;

if(date.HasValue == true)

当然,您可以将它们与等式运算符一起使用,例如==and!=

于 2013-01-30T11:18:52.463 回答