2011-06-24 4 views

答えて

23

最も簡単な修正は、それが持っている値のチェックを省略して、実際にも.Valueよりも安いです

bool b = foo.bar.GetValueOrDefault(); 

あります。これはデフォルトでdefault(T)になります。これは実際にはfalseです(これは、下にあるTフィールドの値を返します)。その後、

あなたはdefault(T)に異なるデフォルトが必要な場合は、:のオペランドを残したので

var value = yourNullable.GetValueOrDefault(yourPreferredValue); 
+1

新しいものを毎日学ぶ。 'Nullable 'をどれくらい使っていて、それらのメソッドについて知っているのか分かりません。 – shambulator

+0

優れた答え。 –

6

んです

bool b = foo.bar.Value ?? false; 

bool b = foo.bar.HasValue ? foo.bar.Value : false; 

を - これは安全ではありません。

ライン:foo.barに値がない場合

bool b = foo.bar.Value ?? false; 

は、InvalidOperationExceptionがスローされます。

代わり

var b = foo.bar ?? false; 

アップデートを使用 - 使用することは非常に良い提案のように見える - 私はちょうど約他の回答から.GetValueOrDefault();を学びました!


アップデート2 - ProgrammingHeroの答えは(+1追加!)も正しいです@ - 行:

bool b = foo.bar.Value ?? false 

が実際にコンパイルされません - なぜなら Error 50 Operator '??' cannot be applied to operands of type 'bool' and 'bool'

+0

'foo.bar'は 'bool?'タイプですが、 'foo.bar.Value'は 'bool'だけです。これは '??'を適用する理由です。演算子を 'foo.bar'のみに設定します。これは正しいタイプです。それを覚えている?指定した値でヌルを置き換えます。ヌル値型または参照型が必要です.boolは単なる値型です。 – Matt

2

ハズレでは。 いずれかが割り当てられている場合

Valueプロパティは、値を返し、そうでなければ のSystem.InvalidOperationExceptionがスロー です。

から:hasValueは、次にあなたがそれを実行しようとすると、2番目のいずれかでスローされた例外を取得する偽であればhttp://msdn.microsoft.com/en-us/library/1t3y8s4s%28v=vs.80%29.aspx

9

を使用する方がより安全になります:

bool b = foo.bar ?? false; 

これは(意外に)安全でヌル・合体演算子の使用目的です。

??演算子はヌル合体演算子と呼ばれ、のヌル値型と参照型のデフォルト値を定義するために使用されます。ヌルでない場合は、左側のオペランドを返します。それ以外の場合は、右オペランドを返します。

出典:Nullable<T>の場合http://msdn.microsoft.com/en-us/library/ms173224.aspx

は、Nullable<T>.GetValueOrDefault(T defaultValue)と機能的に同等です。

コード:

bool b = foo.bar.Value ?? false; 

あなたはタイプを値に演算子を適用することはできませんので、コンパイラエラーが発生し、そしてNullable<T>.Value常に値型を返します(または値がない場合に例外がスローされます)ウィル。

+0

+1は "コンパイルされません"の点で+1されていますが、私は "驚くことに"同意しませんでした。主に99%の値が値の型で使用しているからです:) – Stuart

+1

ヌルキーの効果的な動作は、あなたが参照を扱っているかどうかによって変更が合体します。参照型の場合、ILは 'x == null? x:false; '。 'Nullable 'の場合、?? 'GetValueOrDefault(T);'の呼び出しに置き換えられます。驚き! –

+0

答えとして現在マークされている回答が有用であるため、私はこの回答がOPの質問に対する実際の回答だと感じています。 – Sameer

0

foo.bar.Valueは、ヌル値が存在する場合はそれを表し、を表し、真値がない場合はInvalidOperationExceptionをスローします。

2
bar.Value ?? false 

は、コンパイルエラーを持っています?演算子は参照型またはNULL型でなければなりません。

1

多分、あなたはStackoverflowの記事を見ているかもしれません - それはスタイルでエレガントなヌルチェックです。obj.IfNotNull(lambdaExpression) - objがnullでない場合に必要なオブジェクトを返します。そうでなければnullを返します(しかし例外はスローしません)。

参照されたエンティティにアクセスしている場合は、Entity Frameworkと一緒に使用しました。

Entity1によって参照さ Entity2に含ま EntityDescription返し
var str=Entity1.Entity2.IfNotNull(x=>x.EntityDescription) ?? string.Empty 

- 任意のオブジェクトEntity1又はEntity2nullある場合、または空の文字列。 IfNotNullがなければ、長くて醜い表現ができます。次のように

拡張方法IfNotNullがそこに定義される:

public static TOut IfNotNull<TIn, TOut>(this TIn v, Func<TIn, TOut> f) 
    where TIn : class 
    where TOut: class 
{ 
    if (v == null) return null; else return f(v); 
} 

更新: あなたはC#バージョン6.0(.NET Frameworkの4.6 - しかしseems to support older frameworks 4.x too)にコードを更新する場合、この作業を容易にする新しい演算子があります。"elvis"演算子?.です。

次のように動作します。この場合

var str=(Entity1.Entity2?.EntityDescription) ?? string.Empty 

Entity2nullであれば、評価が停止し、(...)nullなり - ?? string.empty部分がstring.Emptyによってnullを置き換えた後。つまり、.IfNotNull(...)と同じように動作します。

関連する問題