2013-07-24 59 views
-2

我有一個枚舉與4值,我只是好奇,是否會更好地使用if/else語句來檢查什麼值是,還是使用switch語句。c#是否更好使用開關或if/else比較枚舉

當我說得更好時,我的意思是在性能方面,因爲兩者的可讀性都相當。

感謝

+1

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

+0

跳轉表!!!!!! – NINCOMPOOP

+0

位代碼可能更清晰 –

回答

2

我認爲,在性能方面,你不會感到任何區別,如果你只有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