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

我一直在为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; } } 

使用类

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

从枚举types(C#编程指南) :

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

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

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

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

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

 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; } } 

根据评论:

如果需要检查,是否在enum定义了某个int ,可以执行以下操作:

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

或者扩展方法:

 public static T GetEnumValue(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(value, out result)) return result; else return default(T); } } 

可以使用

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

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

从枚举(C#参考) :

枚举的已批准types是byte,sbyte,short,ushort,int,uint,long或ulong。

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

 ScreenSizeEnum.Small.ToString(); //Small 

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

 public static T GetEnumValue(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.Small ScreenSizeEnum strsize = str.GetEnumValue();//ScreenSizeEnum.Small 

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

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