2009-11-25 98 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

相關問題