协慌网

登录 贡献 社区

C#中两个问号共同意味着什么?

跨越这行代码:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

这两个问号意味着什么,是某种三元运算符?谷歌很难找到。

答案

它是空合并运算符,非常类似于三元(立即 if)运算符。另见?? 运营商 - MSDN

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

扩展为:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

进一步扩展到:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

在英语中,它表示 “如果左边的任何内容不为空,请使用它,否则使用右边的内容。”

请注意,您可以按顺序使用任意数量的这些。以下语句将第一个非空的Answer#分配给Answer (如果所有 Answers 都为 null,则Answer为 null):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

值得一提的是,虽然上面的扩展在概念上是等价的,但每个表达式的结果只评估一次。例如,如果表达式是带副作用的方法调用,则这很重要。 (感谢 @Joey 指出这一点。)

仅仅因为没有其他人说过神奇的话:它是空的合并运算符 。它在C#3.0 语言规范的第 7.12 节中定义。

它非常方便,特别是因为它在表达式中多次使用时的工作方式。表格形式:

a ?? b ?? c ?? d

将给出表达式a的结果如果它是非空的,否则尝试b ,否则尝试c ,否则尝试d 。它在每个点都短路。

此外,如果d的类型不可为空,则整个表达式的类型也是不可为空的。

它是空合并运算符。

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

是的,几乎不可能搜索,除非你知道它叫什么! :-)

编辑:这是另一个问题的一个很酷的功能。你可以链接它们。

C#的隐藏功能?