在这行代码中运行:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。


当前回答

其他人已经很好地描述了空合并运算符。在需要对null进行一次测试的情况下,缩短的语法??=可以增加可读性。

传统空测试:

if (myvariable == null)
{
    myvariable = new MyConstructor();
}

使用空合并运算符,这可以写成:

myvariable = myvariable ?? new MyConstructor();

其也可以用缩短的语法编写:

myvariable ??= new MyConstructor();

有些人觉得它更易读、简洁。

其他回答

这里的一些使用合并获取值的示例效率很低。

你真正想要的是:

return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();

or

return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());

这将防止每次重新创建对象。这将确保在创建新对象时分配私有变量,而不是保持私有变量为空并在每次请求时创建新对象。

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

相当于

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

但它很酷的一点是,你可以像其他人说的那样,把它们拴起来。没有提到的一点是,您实际上可以使用它来抛出异常。

A = A ?? B ?? throw new Exception("A and B are both NULL");

它是空合并运算符,非常像三元(立即if)运算符。另见??操作员-MSDN。

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

扩展到:

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

其进一步扩展到:

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

在英语中,它的意思是“如果左边的东西不是空的,就用那个,否则就用右边的东西。”

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

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

另外值得一提的是,虽然上面的展开在概念上是等价的,但每个表达式的结果只计算一次。例如,如果表达式是具有副作用的方法调用,这一点很重要。(感谢@Joey指出了这一点。)

其他人已经很好地描述了空合并运算符。在需要对null进行一次测试的情况下,缩短的语法??=可以增加可读性。

传统空测试:

if (myvariable == null)
{
    myvariable = new MyConstructor();
}

使用空合并运算符,这可以写成:

myvariable = myvariable ?? new MyConstructor();

其也可以用缩短的语法编写:

myvariable ??= new MyConstructor();

有些人觉得它更易读、简洁。

?? 当值为null时,为可为null的类型提供值。因此,如果formsAuth为空,它将返回新的FormsAuthenticationWrapper()。