2012-12-04 55 views
5

我一直在爲Windows Mobile和Android開發一段時間。我對這兩個概念感到困惑。枚舉VS靜態類(正常和字符串值)

比方說,我想根據用戶的設備屏幕尺寸做出決定。所以我會期待如此預定義的值。我可以使用switch語句來處理我的邏輯。 但我不確定我是否應該爲此使用靜態類的枚舉。哪一個是更好的方法。 我可以用這兩種不同的方式來做我的邏輯。哪一個是正確的方法?我很困惑。 我也可以使用字符串值嗎?因爲目前我堅持使用類,我需要更新以使用所有枚舉。那麼如何將我的類更改爲String Enum?任何方式。謝謝。

使用枚舉

//My predefined values 
public enum ScreenSizeEnum 
{ 
    Small, Medium, Large, XLarge, 
} 
//Handling Logic 
private void SetScreenSize(ScreenSizeEnum Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeEnum.Large: 
      //Do Logic 
      break; 
     case ScreenSizeEnum.Small: 
      //Do Logic 
      break; 
    } 
} 

使用

//My predefined values 
public class ScreenSizeClass 
{ 
    public const int Small = 0; 
    public const int Medium = 1; 
    public const int Large = 2; 
    public const int XLarge = 3; 
} 
//Handling Logic 
private void SetScreenSize(int Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeClass.Large: 
      //Do Logic 
      break; 
     case ScreenSizeClass.Small: 
      //Do Logic 
      break; 
    } 
} 
+0

使用枚舉的調試體驗要好得多(至少在c#中)。嘗試調試一個帶有100個開關「int」代碼的開關。 –

+0

這個問題上有一個'Java'標記。您爲'enum'顯示的示例代碼不適用於Java。在使用'switch'時,Java中的枚舉不會像C#那樣工作。 – Squonk

+0

是的。我知道。我在我的android應用程序中也完成相同的流程。我認爲如果我把java代碼也可能太長。但我希望這個概念是一樣的。 –

回答

4

Enumeration Types (C# Programming Guide)

枚舉類型(也稱爲枚舉或枚舉)提供 有效的方法來定義一組可以分配給變量的命名積分常量,它們可以是 。

以下是使用的枚舉,而不是數字 類型的優點:

  1. 您明確指定的客戶端代碼,其值是有效的變量。

  2. 在Visual Studio中,智能感知列出了定義的值。

所以,如果你通過enum,它是強類型,讓你自動獲得了可以傳遞到一個方法是什麼控制。

ScreenSizeEnum size = ScreenSizeEnum.Medium; 
SetScreenSize(size); 

當使用conststatic字段,你definetely需要檢查是否傳遞的int值與預期的和諧拍攝。

int somevalue = ...;//anything 
SetScreenSize(somevalue); //compiles 

private void SetScreenSize(int Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeClass.Large: 
      //Do Logic 
      break; 
     case ScreenSizeClass.Small: 
      //Do Logic 
      break; 
     default: 
      // something else, what to do?? 
      break; 
    } 
} 

基於評論:

如果有必要檢查,一些int是否在enum定義,我們可以做這樣的事情:

int somevallue = 0; 
if(Enum.IsDefined(typeof(ScreenSizeEnum), somevallue)) 
{ 
    //it's ok 
} 

或擴展方法:

public static T GetEnumValue<T>(this string value) where T : struct 
{ 
    Type t = typeof(T); 
    if (!t.IsEnum) 
     throw new Exception("T must be an enum"); 
    else 
    { 
     T result; 
     if (Enum.TryParse<T>(value, out result)) 
      return result; 
     else 
      return default(T); 
    } 
} 

它可以用來

int somevalue = 1; 
ScreenSizeEnum size = somevalue.GetEnumValue<ScreenSizeEnum>(); 

對於string(基於OP的編輯的問題):

enum (C# Reference)

經批准的類型枚舉是byte,sbyte,short,ushort,int, uint,long或ulong。

所以你不能有一個字符串的枚舉。但是您可以使用枚舉中的名稱,因爲ToString方法返回名稱,而不是枚舉的值。

ScreenSizeEnum.Small.ToString(); //Small 

所以,你可以對字符串另一擴展方法:

public static T GetEnumValue<T>(this string value) where T : struct 
{ 
    Type t = typeof(T); 
    if (!t.IsEnum) 
     throw new Exception("T must be an enum"); 
    else 
    { 
     if (Enum.IsDefined(t, value)) 
      return (T)Enum.Parse(t, value); 
     else 
      return default(T); 
    } 
} 

這樣

int i = (int)ScreenSizeEnum.Small; 
string str = ScreenSizeEnum.Small.ToString(); 
ScreenSizeEnum isize = i.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small 
ScreenSizeEnum strsize = str.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small 
+1

你總是可以將一個任意的'int'強制轉換爲一個枚舉值,所以你仍然應該檢查枚舉值的有效性。 –

+0

@mikez這是另一個問題,除此之外還有很多方法。 – horgh

+0

感謝這個偉大的答案。 +1和接受。 :) –

8

這正是枚舉是那裏。不是說你不能使用常量靜態類,但枚舉是更乾淨......

+0

沒錯。 SetScreenSize()的用戶清楚地知道他們必須傳遞特定的值,而不是像屏幕寬度640那樣的int。 – PRouleau

+0

除了不試圖在OP中用OPEN在他們的問題中演示的方式使用'enums'。 – Squonk

1

枚舉用的基本上都是當你想要一個變量或參數從一個固定的具有價值一組可能的常量。您可以用一組static final int常量替換具有類的枚舉。但是使用枚舉比後者更具靈活性。