2012-04-23 2 views
3

Может ли кто-нибудь объяснить следующий код return total ?? decimal.Zero, пожалуйста?C# Что означает эта линия?

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

Итак, основываясь на примерно 10 ответах, я предполагаю, что это называется «оператор с нулевой связью», а затем ??? : p – Gravy

ответ

13

Да, это то, что он означает. Он называется null-coalescing operator.

Это просто ярлык синтаксиса. Однако это может быть более эффективным, поскольку считываемое значение оценивается только один раз. (Обратите внимание, что также может быть функциональным различием в тех случаях, когда оценки значения в два раза имеет побочные эффекты.)

+2

В дополнение к этому конкретный пример кода эквивалентен «возвращать total.GetValueOrDefault (decimal.Zero)» или просто «возвращает total.GetValueOrDefault()», потому что decimal по умолчанию равно нулю. – Matthew

1

Это возвращает первое непустое выражение (первое выражение будучи total, а второе выражением является decimal.Zero)

Так что если total есть null, decimal.Zero будет возвращен.

4

Это нулевой коалесцирующий оператор.

Фактически, это как переписывание кода таким образом:

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

Нет, это как переписывание кода 'return (total! = Null)? total.Value: decimal.Zero; ' –

+0

Моя ошибка, я не заметил, что это была« десятичная? ». Я обновлю ответ. – Tejs

2

Вы прибил его. Он называется оператором с нулевым коалесцированием. Проверьте это here.

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; 
+0

Чтобы быть более точным, вы можете оценить значение один раз в своем эквивалентном блоке кода, то есть 'tmp = SomeOperation(); if (tmp! = null) {return tmp.Value; } else {return Decimal.Zero; } ' –

Смежные вопросы