枚举VS静态类(正常和带字符串值)

时间:2012-12-04 04:28:08

标签: c# java android windows-phone-7

我一直在为windows mobile和android开发。我对这两个概念感到困惑。

假设我想根据用户的设备屏幕尺寸做出决定。所以我期待这么预定义的值。我可以使用switch语句来处理我的逻辑。 但我不确定是否应该为此目的使用静态类的枚举。哪一个是更好的方法。 我可以用这两种不同的方式来做我的逻辑。哪一个是正确的方法?我糊涂了。 我是否也可以使用String值?因为目前我正在坚持使用类,所以我需要更新以使用所有枚举。那么如何将我的类更改为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;
    }
}

4 个答案:

答案 0 :(得分:8)

这正是enums的用途。并不是说你不能将静态类与常量一起使用,但enum是更清晰的......

答案 1 :(得分:7)

来自Enumeration Types (C# Programming Guide)

  

枚举类型(也称为枚举或枚举)提供了一个   定义一组可能的命名积分常量的有效方法   分配给变量。

     

以下是使用枚举而不是数字的优点   类型:

     
      
  1. 您明确指定客户端代码哪些值对变量有效。

  2.   
  3. 在Visual Studio中,IntelliSense会列出已定义的值。

  4.   

因此,如果您传递enum,则会强类型,因此您可以自动控制可以传递给方法的内容。

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

使用conststatic字段时,您需要检查传递的int值是否来自预期的diapason。

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

答案 2 :(得分:1)

当您希望变量或参数具有来自固定的一组可能常量的值时,基本上使用

枚举。您可以使用一组静态final int常量替换枚举类。但是使用枚举更加灵活。可读的appraoch在后一个。

答案 3 :(得分:0)

如果只希望将其用作枚举器,则类可以非常方便。如果要实现几个Get ...函数,这些函数可以返回您需要的其他内容。

我的例子是我有某种类型的类,但是我需要其他相关的类型。