关于c#:使非null类可为空

Make non-null class nullable

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
DateTime"null" value

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


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

然而,有一个骗子;

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

用途:

1
2
3
DateTime? foo = new DateTime(...);

foo.Value.<datetime member>

There are many built-in classes in C# that are not Nullable.

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

msdn-值类型

Unlike reference types, a value type cannot contain the null value.
However, the nullable types feature does allow for value types to
be assigned to null.

您可以使用NullableDatetime使其可以为空。

1
DateTime? dateTimeObject = null;

带有Datetime的问号?使其可以为空。

The syntax T? is shorthand for Nullable, where T is a value type.
The two forms are interchangeable.


当然,可以通过更改声明使integer、double、datetime等为空。

1
DateTime? dt = null.

但是

你需要注意两件事。

1)日期时间?和datetime的数据类型不同,因此,如果您执行如下操作:

1
2
3
4
DateTime? date1 = null;
date1 = DateTime.Now;

DateTime date2 = date1; // Wont work.

获取可为空类型的值的正确方法如下:

1
DateTime date2 = date1.Value;

2)第二个问题是,在使用之前,您需要始终检查是否有值。

1
2
DateTime? date1 = null;
DateTime date2 = date1.Value;

这将引发一个异常:"可以为空的对象必须有一个值"。

因此,添加nullable运算符并不是那么简单,每次使用变量时都需要检查属性"hasValue":

1
2
3
4
5
DateTime? date1 = DateTime.Now;
if(date1.HasValue)
{
    DateTime date2 = date1.Value;
}

明智地使用空值。


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

1
DateTime? date;

?就足够了,就像

1
DateTime? dt = null;

因此,不可为空的类型变为可为空的类型


Datetimestruct,所以是value types。值类型不能是null。除非您可以使用nullable types作为Datetime或其他值类型;

Nullable types are instances of the System.Nullable struct. A
nullable type can represent the correct range of values for its
underlying value type, plus an additional null value.

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

1
DateTime? date = null;

另外,DateTime?System.Nullable相当。

如果您使用可以为空的Datetime,您可以检查它是否有值;

1
if(date.HasValue == true)

当然,您可以将它们与诸如==!=之类的相等运算符一起使用。


严格来说,Datetime是一个struct类型(即值类型),而不是一个class类型(即引用类型),因此它不能为空。但是,Nullable,又名DateTime?,可以为空。Nullable是由编译器进行特殊处理的struct,它的工作方式与您预期的==!=(通过.HasValue)和大多数其他操作(通过所谓的"提升运算符")的工作方式非常相似。