C#中的"DateTime?"是什么意思?

79

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

private DateTime? startdate

DateTime?是什么意思?


可能是 https://dev59.com/LHE85IYBdhLWcg3wnU4d 的重复问题。 - Fandango68
7个回答

144

DateTime是一个struct,而不是class,因此在声明该类型的字段或变量时,您会得到一个DateTime对象,而不是一个引用

同样,就像int不能为null一样,因为它不是引用,所以这个DateTime对象永远不可能为null

添加问号会将其转换为可空类型,这意味着它要么是一个DateTime对象,要么是null

DateTime?Nullable<DateTime>的语法糖,其中Nullable本身是一个struct


23

这是一个可为空的 DateTime。原始类型/结构后面的 ? 表示它是可为空的版本。

DateTime 是一个无法为 null 的结构。根据 MSDN

DateTime 值类型表示从公元年(也称为“公元”或“C.E.”)0001 年 1 月 1 日午夜 12:00:00 到公元年(C.E.)9999 年 12 月 31 日晚上 11:59:59 的日期和时间值。

DateTime? 可以为空。


1
"DateTime?"是C#中"Nullable<DateTime>"的语法糖。 - Pete Stensønes

14

在值类型的末尾添加?允许进行空赋值,而这在其他情况下是不可能的。

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

表示一个对象,其基础类型是值类型,也可以分配一个空引用。

这意味着你可以写出类似于以下代码:

    DateTime? a = null;
    if (!a.HasValue)
    {
        a = DateTime.Now;
        if (a.HasValue)
        {
            Console.WriteLine(a.Value);
        }
    }

DateTime?在语法上等同于Nullable<DateTime>


10

这相当于可空的< DateTime>。你可以在任何基本类型或结构体后添加“?”来表示其可为空。


5

它基本上为原始类型提供了一个额外的状态。它可以是一个值,也可以是null。在不需要分配值的情况下,它非常有用。因此,与其使用例如datetime.min或max,您可以将其赋值为null来表示没有值。


1
"primitive"并不完全等同于"struct";这种语法是用于结构体的。 - Marc Gravell

1
我们知道,DateTime是一个结构体,意味着DateTime是值类型,因此您获得的是DateTime对象,而不是引用,因为DateTime不是类。当您声明该类型的字段或变量时,不能使用null进行初始化,因为值类型不接受null。同样,int也不能为null。因此DateTime对象永远不会为null,因为它不是引用。
但有时我们需要值类型的可空变量或字段,在这种情况下,我们使用问号来使它们成为可空类型,以便它们允许为null。
例如:
DateTime?date = null;
int?intvalue = null;
在上面的代码中,变量date是DateTime对象或null。intvalue也是一样。

0
public class ReportsMapper : CommonMapper
{


    public DateTime? cb_Bill_From_Date { get; set; }

    public DateTime? cb_Bill_To_Date { get; set; }

    public DateTime? tff_Bill_From_Date { get; set; }
    public DateTime? tff_Bill_To_Date { get; set; }
}

如果在过程中将DateTime声明为Null,则会出现错误,指出DateTime对象永远不可能为Null,因此您需要在DateTime后添加?,表示DateTime也是可为空的。

希望这可以帮助到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接