2009-11-25 52 views
1

嗨,我有一个简单的问题,但一直在困扰着我一段时间。使用switch语句常量或枚举? (哪个更好)? C#

问:

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

代码段:

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?

谢谢!

回答

10

为什么不这样做呢?

UserChoices choice = (UserChoices)int.Parse(Console.ReadLine()); 

switch (choice) 
{ 
    case UserChoices.MenuChoiceOne: 
     // etc... 

然后你只需要施放一次。

更新:在代码中修正了!

+0

谢谢!我现在明白了。 – Alex 2009-11-25 19:18:12

+0

这也是我的方法。然而,有一点需要考虑的是你的int值来自哪里。在这种情况下,您正在从控制台读取用户输入,因此用户可能会输入与UserChoices枚举中的任何值都不相对应的值。在这种情况下,我相信演员会抛出一个异常,这可能是也可能不是你想要的行为。如果您不确定您拥有的值是否为有效的枚举值,则可以使用Enum.IsDefined函数来查找。 – 2009-11-25 20:36:10

+0

不,如果您将一个int转换为不存在的值,则不会引发异常(尝试它)。您应该使用“default:”情况来处理这种情况。虽然int.Parse可以抛出,但这是在原始代码中 - 我没有改变它。 – 2009-11-25 20:49:20

1

我相信你可以简单地做:

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

我想枚举超过常量的偏好是因为可读性并没有因为性能。我发现读取代码中的枚举(通常而不仅仅是在switch语句中)比读取/理解常量及其用法更容易。

,并顺便说一句,你没有投任何情况下,你可以投你的开关。

switch((UserChoices)someEnum) 
{ 
... 
+0

好吧,它可以工作,但是当你这样做时究竟发生了什么?你是否将int someEnum转换为你的枚举类型? – Alex 2009-11-25 19:01:50

相关问题