三元式で評価を合体させることが悪いですか? (C#)と
-
13-09-2019 - |
質問
私は少し周りを見てきたと同等の質問を発見していない。
この悪いコーディングプラクティスはありますか?私は簡単にそれを読むことができますが、それはコードを読んで誰かのためにあまりにも不可解なのですか?
bool? testBool = null;
string result;
result = (testBool ?? false ? "Yes" : "No");
編集のいくつかの恐ろしいコードの皆さんに私の謝罪!ここで働く例が
..です
私は応答の速さによって少し圧倒さです。私はこれを削除し、右のそれをするつもりはなく、すでに4件の回答があった!
解決
私は何が起こっているのか明確に括弧を追加したい - 。すなわち
bool? testbool = null;
string result;
result = (testbool ?? false) ? "Yes" : "No";
それと、私はそれで問題ないと思います。それがなければ、私は少し上で何が起こっていたかを把握することを検討しなければならなかった(それもコンパイルする場合 - 私は私の頭の上からの操作の順序を知らない?:対??)
他のヒント
これは、それも明らかに不可解側のビットではないです
string result = (testbool ?? false) ? "Yes" : "No";
または
string result = testbool ?? (false ? "Yes" : "No");
あなたはそれを読みやすくするために代わりにGetValueOrDefault
演算子のNULL可能タイプの??
メソッドを使用することができます:
bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");
編集:元の質問はint?
を使用。今は修正されています。
このコードもコンパイルされませんので、はい、私はそれがあまりにも不可解だと思います。
余談タイプミス、あなたは問題があることを(あなたはLHSがbool
あるとき、??のRHSにint?
を使用しようとしている)を簡単にのスポッティングのせずにそれを掲示しているという事実それはあなたがそれが権利を取得しても良いアイデアではありません示唆してます。
私は、実際の例を参照する必要があると思いますが、私はnull合体演算子を使用して1つの文にIと思います。の通常のスプリットこれを考えて、その後、別の条件演算子を使用して。別ののオプションのは、事業者との関係でNULL可能なタイプの振る舞いを使用することです...しかし、再び、それはの合理のあいまいです。 (私はちょうどその振る舞いがあり、まさに自分自身を思い出させるために持っていた!)
私は、一般的にはnull合体演算子を好むが、私は条件演算子とそれを組み合わせることちょうどそれが少し不明瞭になりますね。私はそれが一般的には、私は二つの文に分割することを好むと思います(代替が余分な方法を導入している初期化用など)単一の式であることに大きなメリットがあったところ、私はおそらく場合にはそれを受け入れるだろうと思います。
編集:1つの選択肢では、のこのの特定の場合だけ「真」と比較することである - 冗長に見えますが、bool?
の場合にはされていない。
result = (testBool == true) ? "Yes" : "No";
括弧はもちろん、必要ではないですが、IMO明瞭さを追加します。
私は、これは単純だと思う:結果が「Yes」testBool
が実際に真である場合のみです。それ以外の場合は「いいえ」です。 [はい]には「デフォルト」を望んでいた場合、あなたが書いたと思います:
result = (testBool == false) ? "No" : "Yes";
それをラップし、私はそれは罰金だと思います。
string result = (testbool ?? false) ? "Yes" : "No";
それ以外の操作の意図した順序は、それが動作しても、明らかにされていません。
(編集:ジョナサンはピンチで私を倒す)
それはすべきではない。
bool? testbool = null;
私はここでNULL可能を使用する必要を見つけることはありません。これは私が二度考えさせるので、私は本当に
としてそれをコーディングしたいですbool testbool = false;
string result;
result = testbool ? "Yes" : "No";
あなたの例が不完全であった場合、私は知らないが、私はデフォルト値に変数を初期化すると、NULL可能、次に使用するよりも正気だと思います?オペレータが、宣言後に値を設定します。