`

枚举类型和位标识

    博客分类:
  • CLR
 
阅读更多

枚举类型定义了一组 “符号/值” 配对

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

分享到:
评论

相关推荐

    C#系列--枚举类型与位标志学习心得

    经常有人问下面的问题,就是在GridView的RowDataBound事件中,判断是否是EditItemTemplate里的控件为什么是 if ((e.Row.RowState & DataControlRowState.Edit) != 0) 而不是 if (e.Row.RowState == ...

    C#作业-Falgs位标志的枚举类型的使用详解

    C#作业--[Falgs]位标志的枚举类型的使用详解

    CLR.via.C#.3rd.Edition 2010 框架设计 Via C# 英文版 免积分

    第7章 常量和字段 第8章 方法:构造器、操作符、转换操作符和参数 第9章 属性 第10章 事件第Ⅳ部分 基本类型 第11章 字符、字符串和文本 第12章 枚举类型和位标志 第13章 数组 第14章 接口 第15章 委托 第16...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现...

    CLR.via.C#.(中文第3版)(自制详细书签)

    第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现IEnumerable...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    第15章 枚举类型和位标志 15.1 枚举类型 15.2 位标志 15.3 向枚举类型添加方法 第16章 数组 16.1 初始化数组元素 16.2 数组转型 16.3 所有数组都隐式派生自System.Array 16.4 所有数组都隐式实现...

    细说C#中的枚举:转换、标志和属性

    枚举是由开发人员声明的一种 值类型 ,它在编译时就声明了一种 具名常量值 。使用枚举可以使我们的代码简单易读,我们先来看一下两个代码段: // 代码段 1 void Method(int country) { switch (country) { case ...

    WPF CheckBox绑定枚举数据源(数据列表)

    WPF在MVVM模式下通过Converter控制不同CheckBox对应不同枚举类型勾选,比如我现在描述一个人有八种行为,这八种行为分别通过8个CheckBox来标识,如果存在这种行为则勾选,不存在则不勾选

    C#中枚举的特性 FlagAttribute详解

    Flag 特性微软的解释是:指示可以将枚举作为位域(即一组标志)处理,FlagsAttribute属性就是枚举类型的一项可选属性,它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二...

    1数据库设计规范.doc

    金额类型使用Money 时间使用 DateTime 枚举类型使用 Varchar(2)、Varchar(4),且需要说明枚举类型的各个不同取值的含义,例如 00,01,0000,0001 在主外键的选择上应注意:为关联字段创建外键、所有的键都必须唯一、...

    谭浩强C程序设计第三版

    枚举类型的定义和枚举变量的说明 191 枚举类型变量的赋值和使用 192 类型定义符typedef 193 位运算 195 位运算符C语言提供了六种位运算符: 195 按位与运算 195 按位或运算 195 按位异或运算 196 求反运算 196 左移...

    C#命名规范说明书.doc

    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

    C语言解析教程(原书第4版)(美) 凯利.pdf

    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 例子:波兰记法...

    《C语言程序设计》谭浩强

    11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...

    谭浩强版c语言程序设计

    11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...

    谭浩强c语言word版

    11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...

    谭浩强c语言程序设计

    11.10.1 枚举类型的定义和枚举变量的说明 184 11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 ...

    谭浩强 C语言程序设计 教程全书 Word版

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

    c语言程序设计(第三版)

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

Global site tag (gtag.js) - Google Analytics