Nullable 2005 (3) : Nullable short-circuit
SQL ではおなじみの,恐怖の3値論理がいよいよ C# にやってきます*1.
ここで C# 2.0 での Nullable が絡む演算の復習でもしてみましょう.まず比較演算の結果はいかなる場合でも null になることはありません*2.
一方,比較演算と & 及び | を除くいわゆる Lifted operators では,null との演算結果は null になります (Null Propagation).この性質はうまく利用すればいわゆる short-circuit evaluation に利用できそうな気もしますが,実際には演算子の引数は全て評価されます.もっとも,今までも f(a) * f(b) で f(a) がたとえ 0 を返したとしても f(b) の評価は行われていましたし,従来通りといえば従来通りな振る舞いですね.
追記どうも私の勘違いで,C# 2.0 の lifted operators には && と || は含まれていないようです.以下ばっさり無視してください.
さて,C 系の言語でいわゆる short-circuit evaluation を行う演算子に,&& と || が挙げられます.C# 2.0 では ?? 演算子も追加されますが,これも a ?? b の a が null であった場合のみ b が評価されるという点で short-circuit と呼べるかもしれません.下の表で色が付いている部分は,A の値によって short-circuit が発生する組み合わせです.
A | B | A&&B | A||B | A??B |
---|---|---|---|---|
true | true | true | true | true |
true | false | false | true | true |
true | null | null | true | true |
false | true | false | true | false |
false | false | false | false | false |
false | null | false | null | false |
null | true | null | true | true |
null | false | false | null | false |
null | null | null | null | null |
いつか以下のようなソースコードを見る日が(書く日が?)来るかもしれませんね.
if( f(a) ?? f(b) ?? f(c) ?? f(d) ?? f(e) ?? false ) { // hogehoge }
*1:実は Visual Basic 6.0 は既にこの世界に足を踏み入れていたようですね.Visual Basic .NET で一旦足を洗ったようですが.「アップグレードに関する推奨事項 : NULL 値の反映の不使用」,「Nullの比較に注意する」など
*2:この点では Visual Basic 6.0 と異なります.一方で(id:atsushieno:20050314:p1)にあるように,"null == null" は true でも "null <= null" は false となったりすることに注意