枚举类型定义了一组 “符号/值” 配对
namespace XXX
{
internal enum Color
{
White, //赋值0
Red, //赋值1
Green, //赋值2
Blue, //赋值3
Orange //赋值4
}
}
每个枚举类型都直接从System.Enum派生,后者从System.ValueType派生,所以,枚举类型是值类型,可表示成未装箱和已装箱形式。
编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段,上面代码会被看成一下代码:
namespace XXX
{
internal struct Color : System.Enum
{ //以下是一些公共常量,它们定义了Color的符号和值
public const Color White=(Color)0;
public const Color Red=(Color)1;
public const Color Green=(Color)2;
public const Color Blue=(Color)3;
public const Color Orange=(Color)4;
//以下是一个公共实例字段,它包含一个Color变量的值,不能写代码来直接引用这个实例字段
public Int32 value_;
}
}
简单来说,枚举类型只是一个结构,其中定义了一组常量字段和一个实例字段。常量字段会嵌入到程序集的元数据中,并可通过反射来访问。
protected void Page_Load(object sender, EventArgs e)
{
PrintEnum(Color.Orange); //vlaue_被设置为4
}
private void PrintEnum(Color color)
{
Label1.Text = color.ToString()+" "+color.ToString("D"); //Orange 4
color--; //3
Label2.Text = color.ToString()+" "+color.ToString("D"); //Blue 3
color--; //2
Label3.Text = color.ToString()+" "+color.ToString("D"); //Green 2
color = color - 3; //-1
Label4.Text = color.ToString() + " " + color.ToString("D") + " " + color.ToString("X"); //-1 -1 FFFFFFFF
}
通过上面例子,我们可以了解到 C#编译器将枚举类型视为基元类型。所以可以使用许多操作符(==,!=,<,>,<=,>=,+,-,^,&,|,~,++,--)来操纵枚举类型的实例。所有这些操作符实际作用于每个枚举类型实例内部的value_实例字段。上面枚举类型的实例调用的ToString()方法里的参数,默认是常规格式,D是十进制格式,X是十六进制格式,当value_的值不在范围内(本例范围是01234),由于找不到值对应的符号,所以常规格式只会显示值而不会显示符号。
每个枚举类型都有一个基础类型,它可以是byte,sbyte,short,ushort,int(最常用,也是C#默认选择的),uint,long,ulong C#规定只能基元类型,如果指定的是使用了FCL类型,如Int32,就会报错
以下显示了如何声明一个基础类型是byte的枚举类型:
internal enum Color : byte
{
White, //赋值0
Red, //赋值1
Green, //赋值2
Blue, //赋值3
Orange //赋值4
}
System.Enum的静态方法GetValues
private void GetEnum()
{
Color[] colors=(Color[])Enum.GetValues(typeof(Color));
foreach (Color c in colors)
{
Label5.Text += c.ToString() + " " + c.ToString("D")+"<br/>";
}
}
White 0
Red 1
Green 2
Blue 3
Orange 4
那么枚举类型是嵌套定义在需要它的类型中,还是定义成和需要它的那个类型的同级?检查FCL,会发现枚举类型通常与需要它的类同级。
定义用于位标识的枚举类型----[Flags]
仍然算是枚举类型,但一般的枚举类型表示单个数值(一个枚举类型实例只能是一种状态,如前面的要么是White要么是Red或其他的一种),而位标识需要显示的为每个符号分配一个数值,它可以代表多种状态的组合
[Flags]
internal enum MyFile
{
Open=1,
Close=2,
Save=4,
SaveClose=MyFile.Close|MyFile.Save,
Other=8
}
protected void Page_Load(object sender, EventArgs e)
{
MyFile file = MyFile.Save|MyFile.Close|MyFile.Open;
PrintBitEnum(file);
}
private void PrintBitEnum(MyFile file)
{
Label6.Text = file.ToString() + " " + file.ToString("D");
Label7.Text = ((file & MyFile.Other)==MyFile.Other).ToString();
}
Open, SaveClose 7
False
http://hi.baidu.com/billschen/blog/item/203de96053ecb0cd8db10d00.html
不是说位标识一定必须要2的整次方,但如果不是2的整次方,得到的结果会不正确(-_-!!其实就是要2的整次方)
http://blog.sina.com.cn/s/blog_717d45b70100obdp.html
分享到:
相关推荐
经常有人问下面的问题,就是在GridView的RowDataBound事件中,判断是否是EditItemTemplate里的控件为什么是 if ((e.Row.RowState & DataControlRowState.Edit) != 0) 而不是 if (e.Row.RowState == ...
C#作业--[Falgs]位标志的枚举类型的使用详解
第7章 常量和字段 第8章 方法:构造器、操作符、转换操作符和参数 第9章 属性 第10章 事件第Ⅳ部分 基本类型 第11章 字符、字符串和文本 第12章 枚举类型和位标志 第13章 数组 第14章 接口 第15章 委托 第16...
第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现...
第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现...
第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现IEnumerable...
第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现...
枚举是由开发人员声明的一种 值类型 ,它在编译时就声明了一种 具名常量值 。使用枚举可以使我们的代码简单易读,我们先来看一下两个代码段: // 代码段 1 void Method(int country) { switch (country) { case ...
WPF在MVVM模式下通过Converter控制不同CheckBox对应不同枚举类型勾选,比如我现在描述一个人有八种行为,这八种行为分别通过8个CheckBox来标识,如果存在这种行为则勾选,不存在则不勾选
Flag 特性微软的解释是:指示可以将枚举作为位域(即一组标志)处理,FlagsAttribute属性就是枚举类型的一项可选属性,它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二...
金额类型使用Money 时间使用 DateTime 枚举类型使用 Varchar(2)、Varchar(4),且需要说明枚举类型的各个不同取值的含义,例如 00,01,0000,0001 在主外键的选择上应注意:为关联字段创建外键、所有的键都必须唯一、...
枚举类型的定义和枚举变量的说明 191 枚举类型变量的赋值和使用 192 类型定义符typedef 193 位运算 195 位运算符C语言提供了六种位运算符: 195 按位与运算 195 按位或运算 195 按位异或运算 196 求反运算 196 左移...
C#命名规范说明书 1 1 大小写约定 1 ...5.3 枚举类型命名 16 6 类型成员的命名 18 6.1 方法的命名 18 6.2 属性的命名 19 6.3 事件的命名 20 6.4 字段的命名 21 7 参数的命名 21 8 资源的命名 22 9 小结 23
9.9 例子:访问位和字节 9.10 adt堆栈 9.11 总结 9.12 练习 第10章 结构和列表处理 10.1 自引用的结构 10.2 线性链表 10.3 链表操作 10.4 一些链表处理函数 10.4.1 插入 10.4.2 删除 10.5 堆栈 10.6 例子:波兰记法...
11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...
11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...
11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...
11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...
11.10.1 枚举类型的定义和枚举变量的说明 14 11.10.2 枚举类型变量的赋值和使用 15 11.11 类型定义符typedef 16 12 位运算 1 12.1 位运算符C语言提供了六种位运算符: 1 12.1.1 按位与运算 1 12.1.2 按位或运算 2 ...
11.10.1 枚举类型的定义和枚举变量的说明 14 11.10.2 枚举类型变量的赋值和使用 15 11.11 类型定义符typedef 16 12 位运算 1 12.1 位运算符C语言提供了六种位运算符: 1 12.1.1 按位与运算 1 12.1.2 按位或运算 2 ...