有人可以解释以下代码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;
答案 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
。