В C # в режиме выпуска они оба компилируются в один и тот же IL
.class private auto ansi '<Module>'
{
} // end of class <Module>
.class public auto ansi beforefieldinit C
extends [mscorlib]System.Object
{
// Methods
.method public hidebysig
instance void M (
bool a
) cil managed
{
// Method begins at RVA 0x2050
// Code size 3 (0x3)
.maxstack 8
IL_0000: ldarg.1
IL_0001: pop
IL_0002: ret
} // end of method C::M
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2054
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method C::.ctor
} // end of class C
В конфигурации отладки у вас есть небольшая разница между b==a
one (устранение шума); см. строку IL_0006.
// Methods
.method public hidebysig
instance void M (
bool a
) cil managed
{
// Method begins at RVA 0x2050
// Code size 9 (0x9)
.maxstack 1
.locals init (
[0] bool,
[1] bool
)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: stloc.1
// sequence point: hidden
IL_0003: ldloc.1
IL_0004: brfalse.s IL_0008
IL_0006: ldarg.1
IL_0007: stloc.0
IL_0008: ret
} // end of method C::M
и b == истинная версия
// Methods
.method public hidebysig
instance void M (
bool a
) cil managed
{
// Method begins at RVA 0x2050
// Code size 9 (0x9)
.maxstack 1
.locals init (
[0] bool,
[1] bool
)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: stloc.1
// sequence point: hidden
IL_0003: ldloc.1
IL_0004: brfalse.s IL_0008
IL_0006: ldc.i4.1
IL_0007: stloc.0
IL_0008: ret
} // end of method C::M
На практике я хотел бы сравнить ваши точные показатели, прежде чем беспокоиться о такой микрооптимизации. Вряд ли это будет лучшим значением для вашего времени, потраченного на оптимизацию.