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

Nullable 2005 (3) : Nullable short-circuit

.NET

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 となったりすることに注意