3項演算子は、3つの値をとる演算子です。
プログラムでは、今のところ条件演算子と呼ばれる、If文を短くしたようなものしかないらしく、暗黙的に条件演算子を指すらしいです。
C#では、下記のように書けます。 x==0の条件が、真のとき2つ目をとり、偽のとき3つ目をとる。
1 |
string msg = x == 0 ? "0だよ" : "0じゃないよ" ; |
VB.NETでは、下記のように書きます。
1 |
Dim msg As String = IIf(x = 0, "0だよ", "0じゃないよ") |
簡潔に書けるけが、一見分かりにくい。
しかも、通常のIf-else文で置き換えれる。
それもあって、3項演算子は、使うべきだとか使わないべきだとか色々あるようです・・・。
自分も、昔はなんとなくで苦手でした。
ですが、使うと読みやすくなるケースもたまにあります。
特にデータベースが絡むときや、他のサービスと絡むときなんかは割と使いどころがあります。
例えば、自分側のサービスでは、使用中フラグを
0:未使用 / 1:使用中
としていたのに、他のサービスでは、
0:稼働中 / 1:停止
と、だいたい意味は同じなんだけど、使われ方の違いからフラグが逆になっているときに、受け渡しの部分だけ下記のように書くと、シンプルになる。
1 |
IIf(flag = 0, 1, 0) |
また、データベースから取得したデータを表示する際にNullかどうか判断して、Nullなら~の場合などもシンプルに書けます。
1 |
IIf(msg = Nothing, "-- no comment --", msg) |
ちなみに、VisualBasic.Netで、.NetFramework3.5以上の場合は、理由がない限り、IIfではなくIfを使ったほうがよいかもです。
C#の三項演算子は問題ないのですが、VB.NETのIIfはショートサーキットではないのです。
*ショートサーキットについてはこちらの記事を。
なので、Nullなら~とかやってると実行時に例外エラーで落ちる時があります・・・。
自分は、複雑な式に入れて1行の中で複数に分岐するような使い方は好みではないです。
しかし、だれが見ても分かるような、”Nullなら空文字にする” 程度でIf-Elseで数行になるようなときは、使ってて見た目的にも分かりやすくなる気がします。
追記: 使っているうちに変に勘違いした。[C#][VB]3項演算子で勘違い
参照:
?: 演算子 http://msdn.microsoft.com/ja-jp/library/ty67wk28%28v=vs.90%29.aspx
If 演算子 http://msdn.microsoft.com/ja-jp/library/bb513985%28v=vs.90%29.aspx
IIf 演算子 http://msdn.microsoft.com/ja-jp/library/27ydhh0d%28v=vs.90%29.aspx