枚举
枚举类型声明为一组相关的符号常数定义了一个类型名称。
枚举类型为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。例如:假设你必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举类型。枚举类型是使用enum关键字声明的。
enum Days{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
默认情况下,枚举中每个元素的基础类型是int。可以使用冒号指定另一种整数值类型。
如果不为枚举数列表中的元素指定值,则它们的值将以1为增量自动递增。在前面的示例中,Days.Sunday的值为0,Days.Monday的值为1,依次类推。
枚举的优点
- 使代码易于维护,有助于确保给变量指定合法的、期望的值。
- 使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示
- 使代码更易于键入。在给枚举类型的实例赋值时,VS.NET IDE会通过IntelliSense弹出一个包含可接受值的列表框,减少了按键次数
枚举实例
声明:
public enum TimeOfDay
{
Morning = 0,
Afternoon = 1,
Evening = 2,
}
使用:
public string getTime OfDay(TimeOfDay time)
{
string result = string.Empty;
swith(time)
{
case TimeOfDay.Morning:
result = "上午";
break;
case TimeOfDay.Afternoon:
result = "下午";
break;
case TimeOfDay.Evening:
result = "晚上";
break;
default:
result = "未知";
break;
}
return result;
}
枚举方法
<1>获取枚举字符串
TimeOfDay time = TimeOfDay.Afternoon;
<2>Enum.Parse()方法。这个方法带3个参数,第一个参数是要使用的枚举类型。其语法是关键字typeof后跟放在括号中的枚举类名。第二个参数是要转换的字符串,第三个参数是一个bool,指定在进行转换时是否忽略大小写。最后,注意Enum.Parse()方法实际上返回一个对象引用,我们需要把这个字符串显示转换为需要的枚举类型(这是一个取消装箱操作的例子)。
TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon", true);
<3>得到枚举的某一个值对应的名称
lbOne.Text = Enum.GetName(typeof(TimeOfDay), 0);
<4>得到枚举的所有的值
foreach(int i in Enum.GetValues(typeof(TimeOfDay)))
lbValues.Text += i.ToString();
<5>枚举的所有名称
foreach(string temp in Enum.GetNames(typeof(TimeOfDay)))
lbNames.Text+=temp;
.NET中Flags枚举的使用
.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天;还有就是用来表示多种复合的状态。这个时候一般需要为枚举加上[Flags]特性标记为位域,例如:
[Flags]
enum Styles
{
ShowBorder = 1, //是否显示边框
ShowCaption = 2, //是否显示标题
ShowToolbox = 4 //是否显示工具箱
}
这样我们就可以用"或"运算符组合多个状态,例如:
myControl.Style = Styles.ShowBorder | Styles.ShowCaption;
这时myControl.Style枚举的值将变成 1+2=3,它的ToString()将变成"Styles.ShowBorder , Styles.ShowCaption"
以下是关于枚举的一些常见操作:
将枚举的值变回枚举对象:
Style style = (Styles) Enum.Parse(typeof(Styles), 4); // ---> style = Styles.ToolBox;
检查枚举是否包含某个元素:
bool hasFlag = ((style & Styles.ShowBorder) != 0);
从组合状态中去掉一个元素。用"^"运算符可以做到。在去掉某个元素前做一番检查,如果枚举包含这个元素,再去掉它:
Styles style = Styles.ShowBorder | Styles.ShowCaption;
if ((style & Styles.ShowBorder) != 0){
style = style ^ Styles.ShowBorder;
}