3

有人可以解释一下下面的代码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;
4

5 回答 5

13

是的,就是这个意思。它被称为空合并运算符

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

于 2012-04-23T20:43:40.207 回答
6

??C# 中称为空合并运算符。大致相当于下面的代码

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;
于 2012-04-23T20:47:32.710 回答
4

它是空合并运算符。

实际上,这就像以这种方式重写代码:

 return (total != null) ? total.Value : decimal.Zero;
于 2012-04-23T20:44:03.253 回答
2

你搞定了。它被称为空合并运算符。在这里查看。

于 2012-04-23T20:45:48.090 回答
1

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

所以如果total为null,decimal.Zero将返回。

于 2012-04-23T20:43:47.457 回答