次のコードを書き換えることが安全です:bar
がNULL可能タイプbool?
??にHasValueを書き換えます。演算子
答えて
最も簡単な修正は、それが持っている値のチェックを省略して、実際にも.Value
よりも安いです
bool b = foo.bar.GetValueOrDefault();
あります。これはデフォルトでdefault(T)
になります。これは実際にはfalse
です(これは、下にあるT
フィールドの値を返します)。その後、
あなたはdefault(T)
に異なるデフォルトが必要な場合は、:のオペランドを残したので
var value = yourNullable.GetValueOrDefault(yourPreferredValue);
んです
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'
'foo.bar'は 'bool?'タイプですが、 'foo.bar.Value'は 'bool'だけです。これは '??'を適用する理由です。演算子を 'foo.bar'のみに設定します。これは正しいタイプです。それを覚えている?指定した値でヌルを置き換えます。ヌル値型または参照型が必要です.boolは単なる値型です。 – Matt
ハズレでは。 いずれかが割り当てられている場合
Valueプロパティは、値を返し、そうでなければ のSystem.InvalidOperationExceptionがスロー です。
から:hasValueは、次にあなたがそれを実行しようとすると、2番目のいずれかでスローされた例外を取得する偽であればhttp://msdn.microsoft.com/en-us/library/1t3y8s4s%28v=vs.80%29.aspx
。
ffoo.bar ?? false
は何をしたい
を使用する方がより安全になります:
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
常に値型を返します(または値がない場合に例外がスローされます)ウィル。
foo.bar.Valueは、ヌル値が存在する場合はそれを表し、を表し、真値がない場合はInvalidOperationExceptionをスローします。
bar.Value ?? false
は、コンパイルエラーを持っています?演算子は参照型またはNULL型でなければなりません。
多分、あなたはStackoverflowの記事を見ているかもしれません - それはスタイルでエレガントなヌルチェックです。obj.IfNotNull(lambdaExpression)
- objがnullでない場合に必要なオブジェクトを返します。そうでなければnullを返します(しかし例外はスローしません)。
参照されたエンティティにアクセスしている場合は、Entity Frameworkと一緒に使用しました。
Entity1
によって参照さ
Entity2
に含ま
EntityDescription
返し
var str=Entity1.Entity2.IfNotNull(x=>x.EntityDescription) ?? string.Empty
- 任意のオブジェクトEntity1
又はEntity2
がnull
ある場合、または空の文字列。 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
Entity2
がnull
であれば、評価が停止し、(...)
はnull
なり - ?? string.empty
部分がstring.Empty
によってnull
を置き換えた後。つまり、.IfNotNull(...)
と同じように動作します。
- 1. 書き換え+ =演算子C++
- 2. C#演算子オーバーロード、文字列の書き換えですか?
- 3. 私たちはIS演算子を他の演算子に置き換えることができます
- 4. C++の演算子[]の演算子オーバーロードを書く方法
- 5. 手書きの数学演算子データベース
- 6. なぜOR演算 "||"このJavaScriptコードの三項演算子 "?:"を置き換えますか?
- 7. 変換演算子と演算子>>
- 8. 演算子( - - )()演算子C#
- 9. 演算子if演算子
- 10. Javascriptで算術演算子を置き換える正規表現
- 11. C++の変換演算子
- 12. C++の変換演算子
- 13. オーバーロード変換演算子テンプレート
- 14. ルビの演算子を中置演算子に変換する方法
- 15. charを算術演算子に変換します
- 16. C++演算子()括弧 - 演算子Type()vs型演算子()
- 17. 変換演算子を削除する
- 18. 変換コンストラクタと変換演算子:precedence
- 19. グループで演算子以上の演算子を使用できますか?
- 20. If文で演算子2演算子を使用できますか?
- 21. 演算子のオーバーロード演算
- 22. C++演算子+演算子+ =オーバーロード
- 23. XOR演算子とstd :: ostream演算子
- 24. Xval演算子と比較演算子?
- 25. 共有ポインタ[]演算子と++演算子
- 26. Pythonのビット演算子 '&' 演算子
- 27. は、Invoke演算子&演算子はKotlin
- 28. C++:演算子オーバーロード、演算子+
- 29. Java演算子 - > how ==演算子
- 30. Android lintエラー?:条件付き演算子演算子
新しいものを毎日学ぶ。 'Nullable'をどれくらい使っていて、それらのメソッドについて知っているのか分かりません。 –
shambulator
優れた答え。 –