【问题标题】:using switch statements with constants or enumerations? (Which is better)? C#使用带有常量或枚举的 switch 语句? (哪个更好)? C#
【发布时间】:2009-11-25 18:51:37
【问题描述】:

您好,我有一个简单的问题,但一直困扰着我一段时间。

问题:

在 C# 中使用 switch 语句时,使用 enums 而不是 constants 是否被认为是更好的做法,反之亦然?或者这是一个偏好问题?我问这个是因为很多人似乎喜欢使用enums,但是当您打开int 值时,您必须将enum 中包含的每个值转换为int,即使您指定enum 的类型。

代码片段:

class Program
{

     enum UserChoices
     {
        MenuChoiceOne = 1,
        MenuChoiceTwo,
        MenuChoiceThree,
        MenuChoiceFour,
        MenuChoiceFive
     }

     static void Main()
     {

        Console.Write("Enter your choice: ");
        int someNum = int.Parse(Console.ReadLine());

        switch (someNum)
        {
            case (int)UserChoices.MenuChoiceOne:
              Console.WriteLine("You picked the first choice!");
              break;
            // etc. etc.
         }
      }
}

有什么方法可以创建enum 的实例,然后将整个enum 转换为int?

谢谢!

【问题讨论】:

    标签: c# enums constants switch-statement


    【解决方案1】:

    为什么不这样做呢?

    UserChoices choice = (UserChoices)int.Parse(Console.ReadLine());
    
    switch (choice)
    {
        case UserChoices.MenuChoiceOne:
            // etc...
    

    那么你只需要投射一次。

    更新:修复了代码中的错误!

    【讨论】:

    • 这也是我的方法。但是,要考虑的一件事是您的 int 值来自何处。在这种情况下,您正在从控制台读取用户输入,因此用户输入的值可能与 UserChoices 枚举中的任何值都不对应。在那种情况下,我相信演员会抛出一个异常,这可能是也可能不是你想要的行为。如果你不确定你拥有的值是否是一个有效的枚举值,你可以使用 Enum.IsDefined 函数来查找。
    • 不,如果您将 int 转换为不存在的值,则不会引发异常(尝试一下)。您应该使用“默认:”案例来处理这种情况。虽然 int.Parse 可以抛出,但那是在原始代码中 - 我没有改变它。
    • 是的,我的错;此演员表没有异常。我应该先尝试一下。我可能正在考虑使用 Enum.Parse 方法将字符串转换为枚举值,如果传递的字符串与枚举值之一的名称不匹配,则会抛出异常。
    【解决方案2】:

    我认为枚举优于常量是因为可读性而不是因为性能。我发现阅读代码中的枚举(通常而不仅仅是在 switch 语句中)比阅读/理解常量及其用法更容易。

    顺便说一句,您不必对每个案例都进行强制转换,您只需转换开关即可。

    switch((UserChoices)someEnum)
    {
    ...
    

    【讨论】:

    • 好的,它有效,但是当你这样做时究竟发生了什么?您是否将 int someEnum 转换为您的枚举类型?
    【解决方案3】:

    我相信你可以简单地做到:

    switch((UserChoices)someNum)
    {
         case UserChoices.MenuChoiceOne:
         break;
         default:
         throw Exception // whatever here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多