C#中两个问号在一起意味着什么?

穿过这行代码:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

这两个问号是什么意思,它是一种三元运算符? 很难在Google中查找。


它是空合并运算符,与三元运算符(immediate-if)非常相似。 也可以看看 ?? 运营商 - MSDN。

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

扩展到:

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

进一步扩展到:

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

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

请注意,您可以按顺序使用其中的任意数量。 下面的语句将指定第一个非空Answer#Answer (如果所有答案都为空,则Answer为空):

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#的隐藏特性?

链接地址: http://www.djcxy.com/p/1575.html

上一篇: What do two question marks together mean in C#?

下一篇: Use of var keyword in C#