2012-04-23 11 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と呼ばれています。

これは単なる構文のショートカットです。ただし、読み取られる値は1回だけ評価されるため、より効率的になります。 (また、値を評価すること倍副作用を有する場合には機能的な違いが存在し得ることに留意されたい。)

+2

これに加えて、具体的なコード例は 'return total.GetValueOrDefault(decimal.Zero)'または単に 'return total.GetValueOrDefault()'と等価です。 – Matthew

1

それは最初の非ヌル表現を返し(totalである第1式を、そして第二の発現は、decimal.Zeroある)

totalがnullの場合、decimal.Zeroが返されます。

4

これはヌル合体演算子です。

は事実上、それはコードをこのように書き換えるようなものだ:

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

いいえ、それはコード 'return(total!= null)を書き直すようなものですか?値:小数点.Zero; ' –

+0

私の間違い、私はそれが「小数点以下」だったことに気付かなかった。私は答えを更新します。 – Tejs

2

あなたはそれを釘付け。それはヌル合体演算子と呼ばれています。それをチェックしてくださいhere

6

C#の??は、null coalescing operatorと呼ばれます。これは、上記のif文の拡張と??オペレータの間に1つの重要な違いは、副作用がどのように処理されるかである大体同等以下のコード

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

からです。 ??の例では、値totalを取得することの副作用は1回だけ発生しますが、ifステートメントでは2回発生します。

この場合、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 {Decimal.Zeroを返します。 } ' –