关于.net:“DateTime?”在C#中是什么意思?

What does “DateTime?” mean in C#?

我正在阅读一本.NET书籍,在其中一个代码示例中,有一个带有此字段的类定义:

1
private DateTime? startdate

DateTime?是什么意思?


由于DateTimestruct,而不是class,当您声明该类型的字段或变量时,会得到DateTime对象,而不是引用。

int不能是null一样,所以这个DateTime对象不能是null对象,因为它不是引用。

添加问号会使它变成一个可以为空的类型,这意味着它要么是一个DateTime对象,要么是null对象。

DateTime?Nullable的句法糖,其中Nullable本身就是struct


它是一个可以为空的日期时间。基元类型/结构之后的?表示它是可以为空的版本。

datetime是一个永远不能为空的结构。来自MSDN:

The DateTime value type represents dates and times with values ranging from 12:00:00 midnight, January 1, 0001 Anno Domini, or A.D. (also known as Common Era, or C.E.) through 11:59:59 P.M., December 31, 9999 A.D. (C.E.)

但是,DateTime?可以为空。


A?作为值类型的后缀,允许不可能的空赋值。

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

Represents an object whose underlying
type is a value type that can also be
assigned a null reference.

这意味着你可以这样写:

1
2
3
4
5
6
7
8
9
    DateTime? a = null;
    if (!a.HasValue)
    {
        a = DateTime.Now;
        if (a.HasValue)
        {
            Console.WriteLine(a.Value);
        }
    }

日期时间?在语法上等价于nullable


它相当于nullable。您可以附加"?"任何基元类型或结构。


它基本上为原语提供了一个额外的状态。它可以是一个值,也可以是空值。它在不需要分配值的情况下很有用。因此,您不必使用datetime.min或max,而是可以将其指定为空,表示没有值。


如我们所知,datetime是一个结构,意味着datetime是一个值类型,所以您得到一个datetime对象,而不是一个引用,因为datetime不是一个类,当您声明一个该类型的字段或变量时,不能以null开头,因为值类型不接受null。与int相同,int不能为空。所以datetime对象永远不为空,因为它不是引用。

但有时我们需要可以为空的变量或值类型的字段,这一次我们使用问号使它们成为可以为空的类型,这样它们就允许为空。

例如:

日期时间?日期=NULL;

int?IntValue=空;

在上面的代码中,变量日期是datetime的对象,或者为空。IntValue相同。