在C#中,`DateTime类型中的`?`是什么?`

我在使用System.DirectoryServices.AccountManagement时遇到了一些代码

public DateTime? LastLogon { get; } 

是什么 ? 在DateTime之后。

我发现了一个参考? 运算符(C#参考) ,但它不是一回事。 (280Z28:这是使用Nullable Types的正确链接。)

? 使它成为可空类型(它是Nullable结构的简写,适用于所有值类型)。

可空类型(C#)

注意:

?? 你链接到的是空合并运算符,它完全不同。

? 在这种情况下,它不是运算符,它是类型的一部分。 语法

 DateTime? 

是的缩写

 Nullable 

所以它声明LastLogon是一个将返回Nullable的属性。 有关详细信息,请参阅MSDN 。

?? 你链接到的地方在这里有点相关。 这是null-coalescing运算符,它具有以下语义。 表达方式

 x ?? y 

如果xnull则求值为y ,否则求值为x 。 这里x可以是引用类型或可空类型。

简写

 Nullable 

它是Nullable的快捷方式。 请注意,使用这些类型的方法无法向COM公开,因为它们使用generics,尽管它们看起来并非如此。

正如其他人提到的那样? 语法使类型为可空。

使用可空类型时要记住的几个关键事项(取自文档 ,但我认为在这里调用它们会很有帮助):

  • 在使用可空类型时,通常使用只读属性ValueHasValue

例如

 int? num = null; if (num.HasValue == true) { System.Console.WriteLine("num = " + num.Value); } 
  • 您可以使用null合并运算符将默认值分配给可空类型。 这非常方便。

例如

 int? x = null; int y = x ?? -1; 

正如其他人所说, ? 用于将值类型声明为可空 。

在以下几种情况下这很好:

  • 从数据库中提取数据时,该数据库具有存储在可空字段中的空值(映射到.NET值类型)
  • 当您需要表示“未指定”或“未找到”时。

例如,考虑一个用于表示被询问一组非强制性问题的客户反馈的类:

 class CustomerFeedback { string Name { get; set; } int? Age { get; set; } bool? DrinksRegularly { get; set; } } 

AgeDrinksRegularly可空类型的使用可以用来表明客户没有回答这些问题。

在这个例子中,你引用我会为LastLogon取一个null值来表示用户从未登录过。