Enum.Parse()或Switch

Nic*_*nto 11 c# performance enums parsing switch-statement

要将字符串转换为枚举,以下哪种方式更好?

  1. 这段代码:

    colorEnum color = (colorEnum)Enum.Parse(typeof(colorEnum), "Green");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或这个:

    string colorString = ...
    colorEnum color;        
    switch (colorString)
    {
        case "Green":
            color = colorEnum.Green;
            break;
        case "Red":
            color = colorEnum.Red;
            break;
        case "Orange":
            color = colorEnum.Orange;
            break;
        ....
    }
    
    Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 8

您应该使用Enum.TryParse,如果失败,您可以正确处理错误.

样品:

     ColorsEnum colorValue; 
     if (Enum.TryParse(colorString, out colorValue))        
        if (Enum.IsDefined(typeof(Colors), colorValue) | colorValue.ToString().Contains(","))  
           Console.WriteLine("Converted '{0}' to {1}.", colorString, colorValue.ToString());
        else
           Console.WriteLine("{0} is not an underlying value of the Colors enumeration.", colorString);
     else
        Console.WriteLine("{0} is not a member of the Colors enumeration.", colorString);
Run Code Online (Sandbox Code Playgroud)

  • Enum.TryParse还有其他缺点 - 请参阅我的回答. (2认同)

Jon*_*eet 7

(警告:包含我自己的开源库的插件......)

就个人而言,我会使用Unconstrained Melody,最终会得到更清晰,更安全的代码:

ColorEnum color = Enums.ParseName<ColorEnum>(text);
Run Code Online (Sandbox Code Playgroud)

TryParseName如果您怀疑它可能无效,您可以使用.显然这需要一个额外的库,但希望你会发现其他有用的东西:)

Enum.TryParse 从.NET 4开始比其他内置选项更好,但是:

  • 你不会在编译时捕获非枚举类型,例如Enum.TryParse<int>(...)仍然会编译; 无约束的旋律真的只允许枚举类型
  • Enum.TryParse也将解析为"1"(或任何数值时转换为字符串) -如果你真的只想到的名字,我觉得这是更好地只接受名字

我肯定不会打开字符串值 - 这意味着如果你重命名枚举值,你必须记住重命名案例值.