在C#.NET中,<??>符号是什么意思?

10

可能是重复问题:
什么是“??”运算符?

我看到了一行代码,其中写着 -

return (str ?? string.Empty).Replace(txtFind.Text, txtReplace.Text);

我想知道这行代码的确切含义(即 ?? 部分)。


我一直接受这个作为替代方案,但从来没有完全理解它的来源。 - Luke Duddridge
1
什么是用于“相等”的运算符? - tanascius
请参阅规范的第7.12节以获取详细信息。 - Eric Lippert
5个回答

21

这是空值合并运算符:如果第一个参数非空则返回它,否则返回第二个参数。在你的例子中,str ?? string.Empty 实际上是用来将空字符串替换为空白字符串。

当与可空类型一起使用时特别有用,因为它允许指定默认值:

int? nullableInt = GetNullableInt();
int normalInt = nullableInt ?? 0;

编辑: str ?? string.Empty 可以用条件运算符重写为 str != null ? str : string.Empty。如果没有条件运算符,你将不得不使用更冗长的 if 语句,例如:

if (str == null)
{
    str = string.Empty;
}

return str.Replace(txtFind.Text, txtReplace.Text);

你能详细解释一下 str ?? string.Empty 的语法吗?我的意思是用详细的语法替换这行代码。 :) - Bibhas Debnath

9

它被称为 空值合并运算符。它允许您有条件地从链中选择第一个非 null 值:

string name = null;
string nickname = GetNickname(); // might return null
string result = name ?? nickname ?? "<default>";
result中的值将是nickname的值(如果不为null),否则为"<default>"

4

??运算符表示返回非空值。因此,如果您有以下代码:

string firstName = null; 

string personName = firstName ?? "John Doe"; 

上面的代码将返回“John Doe”,因为firstName的值为null。
就是这样!

4

这是相当于的意思。

(str == null ? string.Empty : str)

在这种特定情况下是这样的,但如果您用任意表达式替换 str,它会变得更加复杂 - 因为该表达式只会被评估一次。 - Jon Skeet
我从未在除了像这样简单的情况下使用过空值合并运算符,所以我不确定你的意思。您能否提供一个示例来说明您所指的内容? - Marek Karbarz
1
Jon 的意思是,如果你说 F() ?? G(),那不是完全等价于(F() == null ? G() : F()),因为这个东西会调用 F() 两次。实际上更像是隐式的 temp = F(),然后计算 temp == null ? G() : temp。而且实际上这也不对,因为根据运算符两侧的确切类型,情况会变得复杂。我们可能还需要插入强制转换。 - Eric Lippert

1
str ?? String.Empty

可以写成:

if (str == null) {
    return String.Empty;
} else {
    return str;
}

或者作为三元语句:

str == null ? str : String.Empty;

正如Jon Skeet在之前的答案中提到的那样,在简单情况下,您的语句才等效--str表达式只使用??运算符评估一次。 - Broam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接