事实上,对于诸如 等基本类型int
,调用和bool
是有区别的,因为 CIL 有处理这些类型的指令。调用会强制对值进行装箱并进行虚拟方法调用,而使用会导致使用单个 CIL 指令。Equals()
==
Equals()
==
!value
并且value == false
实际上是相同的,至少在与 .NET 4.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