c# is it better to use a switch or if/else when comparing an enum [duplicate]

浪尽此生 提交于 2019-12-13 11:01:47

问题


I have an enum with 4 values and I am just curious as to whether it would be better to use for if/else statements to check what the value is, or use a switch statement.

When I say better I mean in terms of performance, as both are about as readable as one another.

Thanks


回答1:


I think that in terms of performance you won't feel any difference if you have only 4 values to check. I figured out, that switch-case statement produces shorter IL code, than if-else statement.

Example: This C# Code

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; }
            }

        }

Produces folowing IL Code:

.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


来源:https://stackoverflow.com/questions/17839700/c-sharp-is-it-better-to-use-a-switch-or-if-else-when-comparing-an-enum

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!