[C#,VB]ショートサーキット論理演算(短絡)を使おう

C#で論理和と論理積は、下記のように書く。

a | b
a & b

VisualBasic.NET (VB.NET) では、下記のように書く。

a Or b
a And b

しかし、trueとfalseを知りたいだけの場合は、ショートサーキット版で、書くべし。

C#

a || b
a && b

VB.NET

a OrElse b
a AndAlso b

 

なぜか。

それは、| と & は、論理積、論理和を求める計算式だが、ビット演算子でもある。
つまり、true と false を単に比較するのではなく、2進数で書くと、下記のように

0100 & 0101 = 0100
0100 | 0101 = 0101

と右辺と左辺で計算を行っている。
なので、右辺と左辺のどちらも必要である。

しかし、実際にプログラムで使用する際は、これらの演算子はtrueかfalseを求める際に使用されることが多い。

if(a | b){ 
  Console.WriteLine("Hellow");  
}

上記の場合、aの値がtrueであれば、bの値がtrueであれfalseであれ関係ない。

この程度であれば、気にする必要はないが、条件に関数等を用いて、その関数が重い処理を行う場合だと、非効率になる。

        static void Main(string[] args)
        {
            bool flag = true;

            if (flag | waitHoge())
            {
                Console.WriteLine("hellow");
            }
        }

        static bool waitHoge()
        {
            System.Threading.Thread.Sleep(2000);
            return false;
        }

上記のように、flagがtrueで、判定の必要もない場合でも、waitHogeで必ず2秒待たされる。

また、nullでないとき、オブジェクトのメソッドを続けて条件内で使うような下記の場合、ショートサーキットでない場合はヌルポで落ちます。

        static void Main(string[] args)
        {
            String msg = null;

            if (msg != null & msg.Length > 5)
            {
                Console.WriteLine("5文字以上です");
            }
        }

 

詳しいことは本家で。

&演算子  http://msdn.microsoft.com/ja-jp/library/sbf85k1c.aspx
&&演算子  http://msdn.microsoft.com/ja-jp/library/2a723cdk.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>