15

我想我记得在 C# 中看到过类似于?: 三元运算符的东西,它只有两个部分,如果它不为 null 则返回变量值,如果是则返回默认值。像这样的东西:

tb_MyTextBox.Text = o.Member ??SOME OPERATOR HERE?? "default";

基本上相当于这个:

tb_MyTextBox.Text = o.Member != null ? o.Member : "default";

这样的事情是否存在或者我只是想象在某个地方看到这个?

4

4 回答 4

28

是的:

tb_myTextBox.Text = o.Member ?? "default";

http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

于 2010-10-13T16:12:50.093 回答
21

好吧,它与条件运算符不太一样,但我认为您正在考虑空合并运算符(??)。(我猜你确实说过它是“相似的” :) 请注意,“三元”只是指运算符的操作数 - 因此,虽然条件运算符是三元运算符,但空合并运算符是二元运算符。

它大致采用这种形式:

result = first ?? second;

这里second只会在first为 null 时进行评估。它不必是赋值的目标 - 例如,您可以使用它来评估方法参数。

请注意,第一个操作数必须是可以为空的 - 但第二个不是。尽管有一些关于转换的具体细节,但在简单的情况下,整个表达式的类型是第二个操作数的类型。由于关联性,您也可以巧妙地堆叠运算符的使用:

int? x = GetValueForX();
int? y = GetValueForY();
int z = GetValueForZ();

int result = x ?? y ?? z;

注意xandy是如何可以为空的,但z不是result。当然,z 可以是可空的,但result也必须是可空的。

基本上,操作数将按照它们在代码中出现的顺序进行评估,当发现非空值时评估停止。

哦,虽然上面是根据值类型显示的,但它也适用于引用类型(它们总是可以为空的)。

于 2010-10-13T16:14:40.537 回答
3

有趣的是,您使用“??这里的某些操作员??”,因为您要查找的操作员是“??”,即:

tb_MyTextBox.Text = o.Member ?? "default";

http://msdn.microsoft.com/en-us/library/ms173224.aspx

于 2010-10-13T16:14:14.607 回答
1

是的,它被称为 Null Coalescing 运算符:

?? 运算符(C# 参考)(MSDN)

于 2010-10-13T16:14:17.710 回答