跨越这行代码:
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
是的,几乎不可能搜索,除非你知道它叫什么! :-)
编辑:这是另一个问题的一个很酷的功能。你可以链接它们。