C# 编译器似乎为两种代码生成了相同的 IL(包括调试和发布版本)。因此,两者之间必须没有性能差异。
事实上,根据IL,C#编译器将TestTwo翻译成TestOne。当你在 Reflector 中看到编译好的 dll 时,TestTwo 变成了 TestOne。
我编译了以下代码并在 ILDASM 中打开它们。
public bool TestOne(int l, int e, int u, int r)
{
return (l != e && l != u && l != r);
}
public bool TestTwo(int l, int e, int u, int r)
{
return (!(l == e || l == u || l == r));
}
以下是我在 ILDASM 中看到的(基于发布版本)。
.method public hidebysig instance bool TestOne(int32 l,
int32 e,
int32 u,
int32 r) cil managed
{
// Code size 19 (0x13)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: beq.s IL_0011
IL_0004: ldarg.1
IL_0005: ldarg.3
IL_0006: beq.s IL_0011
IL_0008: ldarg.1
IL_0009: ldarg.s r
IL_000b: ceq
IL_000d: ldc.i4.0
IL_000e: ceq
IL_0010: ret
IL_0011: ldc.i4.0
IL_0012: ret
} // end of method Program::TestOne
.method public hidebysig instance bool TestTwo(int32 l,
int32 e,
int32 u,
int32 r) cil managed
{
// Code size 19 (0x13)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: beq.s IL_0011
IL_0004: ldarg.1
IL_0005: ldarg.3
IL_0006: beq.s IL_0011
IL_0008: ldarg.1
IL_0009: ldarg.s r
IL_000b: ceq
IL_000d: ldc.i4.0
IL_000e: ceq
IL_0010: ret
IL_0011: ldc.i4.0
IL_0012: ret
} // end of method Program::TestTwo
我使用 VS2008 sp1 (.NET 3.5 sp1) 来测试这段代码。