[C#][VB]3項演算子のすすめ

3項演算子は、3つの値をとる演算子です。
プログラムでは、今のところ条件演算子と呼ばれる、If文を短くしたようなものしかないらしく、暗黙的に条件演算子を指すらしいです。

C#では、下記のように書けます。 x==0の条件が、真のとき2つ目をとり、偽のとき3つ目をとる。

string msg = x == 0 ? "0だよ" : "0じゃないよ" ;

VB.NETでは、下記のように書きます。

Dim msg As String = IIf(x = 0, "0だよ", "0じゃないよ")

簡潔に書けるけが、一見分かりにくい。
しかも、通常のIf-else文で置き換えれる。
それもあって、3項演算子は、使うべきだとか使わないべきだとか色々あるようです・・・。

自分も、昔はなんとなくで苦手でした。

ですが、使うと読みやすくなるケースもたまにあります。
特にデータベースが絡むときや、他のサービスと絡むときなんかは割と使いどころがあります。

例えば、自分側のサービスでは、使用中フラグを
0:未使用 / 1:使用中
としていたのに、他のサービスでは、
0:稼働中 / 1:停止
と、だいたい意味は同じなんだけど、使われ方の違いからフラグが逆になっているときに、受け渡しの部分だけ下記のように書くと、シンプルになる。

IIf(flag = 0, 1, 0)

また、データベースから取得したデータを表示する際にNullかどうか判断して、Nullなら~の場合などもシンプルに書けます。

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

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>