在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
当前回答
谢谢大家,这里是我在MSDN网站上找到的最简洁的解释:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
其他回答
谢谢大家,这里是我在MSDN网站上找到的最简洁的解释:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
相当于
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
但它很酷的一点是,你可以像其他人说的那样,把它们拴起来。没有提到的一点是,您实际上可以使用它来抛出异常。
A = A ?? B ?? throw new Exception("A and B are both NULL");
这个运算符称为空合并运算符。如果操作数不为空,则返回左侧操作数;否则返回右手操作数。
int? variable1 = null;
int variable2 = variable1 ?? 100;
如果variable1不为空,则将variable2设置为variable1的值;否则,如果variable1==null,则将variable2设置为100。
它是空合并运算符,非常像三元(立即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的变量中的可为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)我希望这能澄清你的问题。