SG

If 演算子でワンライナー

 関数型言語を勉強していると、普段メインで使用している VB.NET が如何に長ったらしいかと思い知らされます。パターンマッチにパイプラインにバナナクリップが使いたくなる 2011。

IIf 関数

 互換のため、VB.NET にも IIf 関数が存在します。単純な条件分岐を 1 行で書くことができるのですが、Option Strict On をコーディング規約で強制させられていると、必ず型変換が必要になり、これだったら使用しないほうがいいような気になってきます*1

Dim value As Integer = Convert.ToInt32(IIf(message = "Odd", 1, 0))

If 演算子

 VS2008 より、新しく If 演算子が追加されました。今更感バリバリ最強No.1ですが。If 演算子コンパイラが型を判定してくれるので、型変換しなくてもよく、非常にすっきりとしたコードを書くことができます。

Dim value As Integer = If(message = "Odd", 1, 0)

評価方法も変更された

 IIf 関数では、TruePart(真の場合に返されるオブジェクト) と、FalsePart(偽の場合に返されるオブジェクト)の両方を、結果に関わらず評価します。そのため、次のコードでは例外が発生してしまいます。

// edamameshiba が Nothing でも Name が呼ばれてしまう
Dim str As String = IIf(edamameshiba IsNot Nothing, edamameshiba.Name, "Nothing").ToString()

 うーん使いづらい。If 演算子はこのあたりも改善されていて、真の場合には TruePart、偽の場合には FalsePart のみを評価します。

Dim str As String = If(edamameshiba IsNot Nothing, edamameshiba.Name, "Nothing")

 短いコードっていいなぁと思う今日この頃です。

ショートコードテクニックを磨きたい

 C#ショートコードプログラミング (MSDNプログラミングシリーズ)
 この本が非常に気になっています。メインは VB.NET ですが、参考になる部分は多いのではないかと。ただ型推論に関しては、VB.NET では無闇に使用しないほうがいいかなぁ……。

*1:CInt なら短くすみますが、VisualBasic 名前空間はできるだけ使わないほうがよいと思っている派。