11

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

假设我想根据某些用户设备的屏幕尺寸做出决定。所以我会期待如此预定义的值。我可以使用 switch 语句来处理我的逻辑。但我不确定是否应该为此目的使用静态类的枚举。哪个是更好的方法。我可以用这两种不同的方式来做我的逻辑。哪一个是正确的方法?我很困惑。我也可以使用字符串值吗?因为目前我坚持使用课程,所以我需要更新以使用所有枚举。那么如何将我的类更改为字符串枚举呢?反正。谢谢。

使用枚举

//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

4 回答 4

9

这正是枚举的用途。并不是说您不能将静态类与常量一起使用,而是枚举要干净得多……

于 2012-12-04T04:30:41.327 回答
9

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

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

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

  1. 您清楚地为客户端代码指定哪些值对变量有效。

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

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

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

使用constorstatic字段时,您定义需要检查传递的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;
    }
}

根据评论:

如果有必要检查 someint是否定义在 中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的编辑问题):

枚举(C# 参考)

已批准的枚举类型为 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
于 2012-12-04T04:33:12.153 回答
1

当您希望变量或参数具有来自一组固定的可能常量的值时,基本上使用枚举。您可以将枚举替换为具有一组静态 final int 常量的类。但是使用枚举比后者更灵活、更易读。

于 2012-12-04T04:47:09.847 回答
0

如果您只想将更多内容用作枚举器,则类可能非常方便。如果你想实现几个 Get... 函数,可以返回你需要的其他东西。

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

于 2018-09-18T08:35:45.290 回答