C#で論理和と論理積は、下記のように書く。
1 2 |
a | b a & b |
VisualBasic.NET (VB.NET) では、下記のように書く。
1 2 |
a Or b a And b |
しかし、trueとfalseを知りたいだけの場合は、ショートサーキット版で、書くべし。
C#
1 2 |
a || b a && b |
VB.NET
1 2 |
a OrElse b a AndAlso b |
なぜか。
それは、| と & は、論理積、論理和を求める計算式だが、ビット演算子でもある。
つまり、true と false を単に比較するのではなく、2進数で書くと、下記のように
1 2 |
0100 & 0101 = 0100 0100 | 0101 = 0101 |
と右辺と左辺で計算を行っている。
なので、右辺と左辺のどちらも必要である。
しかし、実際にプログラムで使用する際は、これらの演算子はtrueかfalseを求める際に使用されることが多い。
1 2 3 |
if(a | b){ Console.WriteLine("Hellow"); } |
上記の場合、aの値がtrueであれば、bの値がtrueであれfalseであれ関係ない。
この程度であれば、気にする必要はないが、条件に関数等を用いて、その関数が重い処理を行う場合だと、非効率になる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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でないとき、オブジェクトのメソッドを続けて条件内で使うような下記の場合、ショートサーキットでない場合はヌルポで落ちます。
1 2 3 4 5 6 7 8 9 |
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