在C#中,`DateTime?`类型中的`?`表示可空类型。

6

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

public DateTime? LastLogon { get; }

DateTime后面的问号是什么意思?

我找到了关于 ??运算符(C#参考)的参考资料,但那不是同一件事。(280Z28:这里是使用可空类型的正确链接。)


现在C#中有很多可空类型。 但要小心,Null不等于0。 - TalkingCode
1
你的帖子中的链接实际上是指“??”运算符,它与之无关但非常酷的空合并运算符。 - Ian Robinson
2
请阅读C#规范的4.1.10节以获取详细信息。 - Eric Lippert
@Charlie:我认为这是一个伪装成羊皮的重复问题,直到我在标题中重新措辞。 - Sam Harwell
6个回答

27
?是为了使其成为可空类型 (它是 Nullable 结构的简写,适用于所有值类型)。
参考链接:可空类型 (C#) 注意:
你所提到的 ?? 是完全不同的空值合并运算符。

4
我认为在这里需要指出的最重要的一点是,这不仅适用于DateTime类型,对于int、decimal和其他通常不可为空的类型也同样适用,且方式相同。 - Anne Schuessler

4
在这种情况下,? 不是运算符,而是类型的一部分。语法如下:
DateTime?

是...的缩写

Nullable<DateTime>

它声明了LastLogon是一个属性,将返回一个Nullable<DateTime>。详情请参见MSDN

链接??在这里有些相关。这是空值合并运算符,具有以下语义。表达式

x ?? y

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


0

缩写

Nullable<DateTime>

0

正如其他人提到的那样,这个问号语法使类型可为空。

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

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

例如:

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

例如:

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

0

正如其他人所提到的,?用于将值类型声明为可空

这在以下几种情况下非常有用:

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

例如,考虑一个用于表示从客户那里收到的一组非强制性问题的反馈的类:

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

使用可空类型来表示客户未回答AgeDrinksRegularly的问题。

在你提到的例子中,我会将null值视为用户从未登录的LastLogon


0

这是一个 Nullable<DateTime> 的快捷方式。请注意,使用这些类型的方法不能暴露给 COM,因为它们使用泛型,尽管看起来似乎不是。


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