-2
我有一個枚舉與4值,我只是好奇,是否會更好地使用if/else語句來檢查什麼值是,還是使用switch語句。c#是否更好使用開關或if/else比較枚舉
當我說得更好時,我的意思是在性能方面,因爲兩者的可讀性都相當。
感謝
我有一個枚舉與4值,我只是好奇,是否會更好地使用if/else語句來檢查什麼值是,還是使用switch語句。c#是否更好使用開關或if/else比較枚舉
當我說得更好時,我的意思是在性能方面,因爲兩者的可讀性都相當。
感謝
我認爲,在性能方面,你不會感到任何區別,如果你只有4個值進行檢查。我發現,switch-case語句比if語句產生更短的IL代碼。
示例: 此C#代碼
static void Main(string[] args)
{
var testEnumeration = SomeEnum.Val3;
if (testEnumeration == SomeEnum.Val1)
Console.WriteLine("1");
else if (testEnumeration == SomeEnum.Val2)
Console.WriteLine("2");
else if (testEnumeration == SomeEnum.Val3)
Console.WriteLine("3");
else if (testEnumeration == SomeEnum.Val4)
Console.WriteLine("4");
switch (testEnumeration)
{
case SomeEnum.Val1:
{ Console.WriteLine("1"); break;}
case SomeEnum.Val2:
{ Console.WriteLine("2"); break; }
case SomeEnum.Val3:
{ Console.WriteLine("3"); break; }
case SomeEnum.Val4:
{ Console.WriteLine("4"); break; }
}
}
可生產如下因素IL代碼:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 180 (0xb4)
.maxstack 2
.locals init ([0] valuetype ConsoleTest.Program/SomeEnum testEnumeration,
[1] bool CS$4$0000,
[2] valuetype ConsoleTest.Program/SomeEnum CS$4$0001)
IL_0000: nop
IL_0001: ldc.i4.2
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.0
IL_0005: ceq
IL_0007: ldc.i4.0
IL_0008: ceq
IL_000a: stloc.1
IL_000b: ldloc.1
IL_000c: brtrue.s IL_001b
IL_000e: ldstr "1"
IL_0013: call void [mscorlib]System.Console::WriteLine(string)
IL_0018: nop
IL_0019: br.s IL_0061
IL_001b: ldloc.0
IL_001c: ldc.i4.1
IL_001d: ceq
IL_001f: ldc.i4.0
IL_0020: ceq
IL_0022: stloc.1
IL_0023: ldloc.1
IL_0024: brtrue.s IL_0033
IL_0026: ldstr "2"
IL_002b: call void [mscorlib]System.Console::WriteLine(string)
IL_0030: nop
IL_0031: br.s IL_0061
IL_0033: ldloc.0
IL_0034: ldc.i4.2
IL_0035: ceq
IL_0037: ldc.i4.0
IL_0038: ceq
IL_003a: stloc.1
IL_003b: ldloc.1
IL_003c: brtrue.s IL_004b
IL_003e: ldstr "3"
IL_0043: call void [mscorlib]System.Console::WriteLine(string)
IL_0048: nop
IL_0049: br.s IL_0061
IL_004b: ldloc.0
IL_004c: ldc.i4.3
IL_004d: ceq
IL_004f: ldc.i4.0
IL_0050: ceq
IL_0052: stloc.1
IL_0053: ldloc.1
IL_0054: brtrue.s IL_0061
IL_0056: ldstr "4"
IL_005b: call void [mscorlib]System.Console::WriteLine(string)
IL_0060: nop
IL_0061: ldloc.0
IL_0062: stloc.2
IL_0063: ldloc.2
IL_0064: switch (
IL_007b,
IL_0089,
IL_0097,
IL_00a5)
IL_0079: br.s IL_00b3
IL_007b: nop
IL_007c: ldstr "1"
IL_0081: call void [mscorlib]System.Console::WriteLine(string)
IL_0086: nop
IL_0087: br.s IL_00b3
IL_0089: nop
IL_008a: ldstr "2"
IL_008f: call void [mscorlib]System.Console::WriteLine(string)
IL_0094: nop
IL_0095: br.s IL_00b3
IL_0097: nop
IL_0098: ldstr "3"
IL_009d: call void [mscorlib]System.Console::WriteLine(string)
IL_00a2: nop
IL_00a3: br.s IL_00b3
IL_00a5: nop
IL_00a6: ldstr "4"
IL_00ab: call void [mscorlib]System.Console::WriteLine(string)
IL_00b0: nop
IL_00b1: br.s IL_00b3
IL_00b3: ret
} // end of method Program::Main
http://stackoverflow.com/questions/767821/is-else-if-faster-than-開關案例 http://stackoverflow.com/questions/445067/if-vs-switch-speed http://stackoverflow.com/questions/395618/is-there-any-significant-difference-between-使用if-else-and-switch-case-in-c 多個副本 – ToastyMallows
跳轉表!!!!!! – NINCOMPOOP
位代碼可能更清晰 –