在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
当前回答
这里的一些使用合并获取值的示例效率很低。
你真正想要的是:
return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();
or
return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());
这将防止每次重新创建对象。这将确保在创建新对象时分配私有变量,而不是保持私有变量为空并在每次请求时创建新对象。
其他回答
这是三元运算符的短手。
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
或者对于那些不做三元的人:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
以最简单的方式,两个问号被称为“合并运算符”,它返回链中的第一个非空值。
例如,如果您从一个不可为null的变量中的可为null对象获取值,则可以使用此运算符。即
int a=1;整数?b=空;a=b??0;
上述方程的结果将为零,因为b为空,我们使用了??运算符,这意味着当且仅当b为空时,它将返回0。
int a=1;整数?b=15;a=b??0;
在上式中,a将得到值“15”,因为b具有有效值且不为空。还有,你不能使用??运算符。
在以上示例中,我使用了??0,但是,在??之后也可以使用一个完整的新公式??操作人员
例如a=b??(x==1?10:15)我希望这能澄清你的问题。
接合运算符
相当于
FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth
只是因为还没有人说过这个神奇的词:它是空合并运算符。它在C#3.0语言规范的第7.12节中定义。
它非常方便,特别是因为它在表达式中多次使用时的工作方式。形式的表达式:
a ?? b ?? c ?? d
将给出表达式a的结果,如果它是非空的,否则尝试b,否则尝试c,否则尝试d。它在每个点都短路。
此外,如果d的类型不可为null,则整个表达式的类型也不可为空。
这没什么危险。事实上,它很美。如果需要,可以添加默认值,例如:
CODE
int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;