c#这条线是什么意思?

时间:2012-04-23 20:42:21

标签: c# return-value null-coalescing-operator

有人可以解释以下代码return total ?? decimal.Zero吗?

public decimal GetTotal()
{
    // Part Price * Count of parts sum all totals to get basket total
    decimal? total = (from basketItems in db.Baskets
                      where basketItems.BasketId == ShoppingBasketId
                      select (int?)basketItems.Qty * basketItems.Part.Price).Sum();
    return total ?? decimal.Zero;
}

这是否意味着以下内容?

    if (total !=null) return total;
    else return 0;

5 个答案:

答案 0 :(得分:13)

是的,这就是它的含义。它被称为null-coalescing operator

这只是一个语法快捷方式。但是,它可以更有效,因为读取的值仅评估一次。 (注意,在两次评估值有副作用的情况下,也可能存在功能差异。)

答案 1 :(得分:6)

C#中的??称为null coalescing operator。它大致等同于以下代码

if (total != null) {
  return total.Value;
} else {
  return Decimal.Zero;
}

上述if语句扩展和??运算符之间的一个关键区别是如何处理副作用。在??示例中,获取值total的副作用仅发生一次,但在if语句中它们发生两次。

在这种情况下无关紧要,因为total是本地的,因此没有副作用。但如果说它是一个副作用属性或方法调用,这可能是一个因素。

// Here SomeOperation happens twice in the non-null case 
if (SomeOperation() != null) {
  return SomeOperation().Value;
} else { 
  return Decimal.Zero;
}

// vs. this where SomeOperation only happens once
return SomeOperation() ?? Decimal.Zero;

答案 2 :(得分:4)

这是空合并运算符。

实际上,就像用这种方式重写代码一样:

 return (total != null) ? total.Value : decimal.Zero;

答案 3 :(得分:2)

你钉了它。它被称为null-coalescing运算符。请查看here

答案 4 :(得分:1)

它返回第一个非空表达式(第一个表达式为total,第二个表达式为decimal.Zero

因此,如果total为空,则会返回decimal.Zero