PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

C#の3項演算子を久しぶりに見た件

c#


私的なことですが3項演算子は、最近仕事でお目にかかったことが無かったので提出されたときに非常に新鮮な感じを受けました。

と同時に、できれば使わない方がいいかなとも思います。

なぜなら、3項演算子は「これ以上拡張の余地が無いから」と考えています。

将来的に不変な、真偽値(2値判定)には良いのかもしれませんが以下のケースで不自由かと思います。

なので将来を見通す力のある預言者以外は利用非推奨です。

  • 2値以外へ変更になった時、結局書き換えないといけない
  • 3値以上の判定を3項演算子の複合文で書くと表現が難しいケースがある(Excelのマクロかよ!的世界観)
  • 評価結果はそれぞれ同じ戻り値を持たないといけない

例えば以下のように

public int Foo(bool a, bool b)
{
   return a ? 1 : (b ? 2 : 3);
}

評価対象が2つのものに対して3項演算子は理解容易性が結構ギリギリです。

更にパラメータが3つに増加した場合を3項演算子で処理しようと・・・となります。

あと、return = 3 の時に例外を出したいとかになったら

public int Foo(bool a, bool b)
{
   return a ? 1 : (b ? 2 : throw new NotSupportedException("This case is not suported."));
}

以下のよう書くことはできますが、可読性が低下するだけなので、素直に全部if文で書いた方がよさそうです。

public int Foo(bool a, bool b)
{
    if(a || !b)
    {
        throw new NotSupportedException("This case is not suported.");
    }
    
    // 以降に3項演算子で式を評価しようとすると a || !b のケースで
    // 戻り値がを記述しないといけなくなり謎の値を入れないといけないご様子
    return a ? 1 : (b ? 2 : -1);
}

なので、折角コーディングしてもらい久しぶり見た3項演算子ですが、ちょっと書き直してもらうことになりそうです。
.oO(というか今更だけどコーディング規約に使用禁止って書いてなかったっけ…?守ってよ!)