【发布时间】:2011-01-18 09:37:29
【问题描述】:
我看到了一行代码 -
return (str ?? string.Empty).Replace(txtFind.Text, txtReplace.Text);
我想知道这一行的确切含义(即?? 部分)..
【问题讨论】:
-
我一直接受它作为替代品,但从未真正完全理解它来自我自己;
-
详见规范第 7.12 节。
我看到了一行代码 -
return (str ?? string.Empty).Replace(txtFind.Text, txtReplace.Text);
我想知道这一行的确切含义(即?? 部分)..
【问题讨论】:
它是null coalescing operator:如果它不为null,则返回第一个参数,否则返回第二个参数。在您的示例中,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吗?我的意思是用详细的语法替换这一行。 :)
它被称为null coalescing operator。它允许您有条件地从链中选择第一个非空值:
string name = null;
string nickname = GetNickname(); // might return null
string result = name ?? nickname ?? "<default>";
result 中的值将是nickname 的值(如果它不为空),或者是"<default>"。
【讨论】:
相当于
(str == null ? string.Empty : str)
【讨论】:
str,它会变得更加复杂 - 因为该表达式只会被计算一次。
??运算符说返回非空值。所以,如果你有以下代码:
string firstName = null;
string personName = firstName ?? "John Doe";
上面的代码将返回“John Doe”,因为 firstName 的值为空。
就是这样!
【讨论】:
str ?? String.Empty
可以写成:
if (str == null) {
return String.Empty;
} else {
return str;
}
或作为三元语句:
str == null ? str : String.Empty;
【讨论】:
str 表达式仅使用 ?? 运算符评估一次。