実際、などの基本的なタイプint
の場合、呼び出しと、CILにそのようなタイプを処理するための指示があるため、呼び出しにbool
は違いがあります。呼び出しは、値のボックス化と仮想メソッド呼び出しを強制しますが、を使用すると、単一のCIL命令が使用されます。Equals()
==
Equals()
==
!value
value == false
少なくとも.NET4.0にバンドルされているMicrosoftのC#コンパイラでは、実際には同じです。
したがって、以下の方法での比較
public static int CompareWithBoxingAndVirtualMethodCall(bool value)
{
if (value.Equals(false)) { return 0; } else { return 1; }
}
public static int CompareWithCILInstruction(bool value)
{
if (value == false) { return 0; } else { return 1; }
if (!value) { return 0; } else { return 1; } // comparison same as line above
}
次のCIL命令にコンパイルされます。
// CompareWithBoxingAndVirtualMethodCall
ldarga.s 'value'
ldc.i4.0
call instance bool [mscorlib]System.Boolean::Equals(bool) // virtual method call
brfalse.s IL_000c // additional boolean comparison, jump for if statement
// CompareWithCILInstruction
ldarg.0
brtrue.s IL_0005 // actual single boolean comparison, jump for if statement