Nic*_*nto 11 c# performance enums parsing switch-statement
要将字符串转换为枚举,以下哪种方式更好?
这段代码:
colorEnum color = (colorEnum)Enum.Parse(typeof(colorEnum), "Green");
Run Code Online (Sandbox Code Playgroud)或这个:
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)您应该使用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)
(警告:包含我自己的开源库的插件......)
就个人而言,我会使用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"(或任何数值时转换为字符串) -如果你真的只想到的名字,我觉得这是更好地只接受名字我肯定不会打开字符串值 - 这意味着如果你重命名枚举值,你必须记住重命名案例值.