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

Akh*_*ran 9 c# java android windows-phone-7

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

假设我想根据用户的设备屏幕大小做出决定.所以我期待这么预定义的值.我可以使用switch语句来处理我的逻辑.但我不确定是否应该为此目的使用静态类的枚举.哪一个是更好的方法.我可以用这两种不同的方式来做我的逻辑.哪一个是正确的方法?我糊涂了.我也可以使用String值吗?因为目前我坚持使用类,所以我需要更新才能使用所有枚举.那么如何将我的类更改为String Enum?无论如何.谢谢.

使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用类

//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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Zdr*_*nev 8

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


hor*_*rgh 7

枚举类型(C#编程指南):

枚举类型(也称为枚举或枚举)提供了一种有效的方法来定义可以分配给变量的一组命名的整数常量.

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

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

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

因此,如果您通过enum,则它是强类型的,因此您可以自动控制可以传递给方法的内容.

ScreenSizeEnum size = ScreenSizeEnum.Medium;
SetScreenSize(size); 
Run Code Online (Sandbox Code Playgroud)

在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

基于评论:

如果有必要检查,是否有一些int定义enum,可以做这样的事情:

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

或者扩展方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

可以使用

int somevalue = 1;
ScreenSizeEnum size = somevalue.GetEnumValue<ScreenSizeEnum>();
Run Code Online (Sandbox Code Playgroud)

至于string(基于OP的编辑问题):

枚举(C#参考):

枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong.

所以你不能有一个字符串枚举.但您可以使用枚举中的名称,因为ToString方法返回名称,而不是枚举的值.

ScreenSizeEnum.Small.ToString(); //Small
Run Code Online (Sandbox Code Playgroud)

所以你可以在字符串上有另一个扩展方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

以便

int i = (int)ScreenSizeEnum.Small;
string str = ScreenSizeEnum.Small.ToString();
ScreenSizeEnum isize = i.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small
ScreenSizeEnum strsize = str.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small
Run Code Online (Sandbox Code Playgroud)