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