`

枚举类型和位标识

    博客分类:
  • 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#系列--枚举类型与位标志学习心得

    ### C#中的枚举类型与位标志:学习心得与实践应用 #### 一、枚举类型的基本概念 在C#编程语言中,枚举(Enum)是一种数据类型,用于定义一组固定的命名常量集合。这些常量通常是整数值,但它们具有更明确的意义和...

    章枚举类型和位运算PPT学习教案.pptx

    - 通过位掩码设置或清除某个标志位。 - 数据压缩和解压缩,利用位运算减少存储空间。 - 在多线程编程中,通过原子操作和位运算实现同步机制。 - 计算机网络中,通过位运算处理IP地址和端口号。 - 加密算法中,位运算...

    C# 枚举类型的实例说明

    通过以上实例,我们不仅了解了C#枚举类型的基本定义和使用方法,还掌握了如何进行数值操作、方法调用以及与字符之间的转换。枚举类型在C#编程中扮演着重要的角色,合理地运用枚举类型可以使得代码更加清晰、高效。

    java枚举类型说明

    枚举类型在Java中的引入标志着一种更为类型安全且灵活的编程方式。 #### 二、Java枚举的基本概念 Java中的枚举是一种特殊的类,用于定义一组固定的常量值。相比于传统的`public static final`变量,枚举提供了更多...

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

    在“C#作业—[Flags]位标志的枚举类型的使用详解”中,我们将深入探讨如何定义、操作以及使用这种类型的枚举。 1. **定义Flags枚举** 要定义一个带有`Flags`特性的枚举,首先需要在枚举声明前加上`[Flags]`标记。...

    枚举类型.zip

    枚举类型在编程语言中是一种...枚举类型在软件开发中扮演着重要角色,尤其是在处理固定选项、标志位或状态机时。它们使得代码更加清晰、安全,并且易于维护。理解并熟练运用枚举类型,能帮助开发者写出更高质量的程序。

    C++中枚举类型(enum)

    在实际应用中,枚举类型常用于表示位标志(bit flags),即通过组合不同的枚举值来表示多种状态。例如,在文件访问权限的场景中: ```cpp enum FileAccess { Read = 0x1, // 二进制形式为0001 Write = 0x2, // 二...

    C语言开发之枚举类型详解

    枚举类型(enumerated type)是C语言中的一种自定义数据类型,它允许程序员定义一组相关的整数值集合,这些值通常表示特定的概念或状态。枚举类型提供了比直接...在编写涉及多状态或标志的代码时,枚举类型尤其有用。

    12-结构体、共用体和枚举类型-自己使用的C语言教程PPT-适合老师备课或者自学.pptx

    C语言结构体、共用体和枚举类型知识要点 结构体是C语言中的复杂数据类型,它可以由基本数据类型和其他结构体组成。结构体的定义需要使用关键字struct,并且需要指定结构体的名称和成员变量。结构体类型的定义的一般...

    C语言程序设计-枚举类型.pptx

    枚举类型是C语言中的一种数据类型,它用于定义一组具有特定值的常量集合,这些值通常代表一些有意义的标识或状态。枚举类型在编程中常常用于简化代码,提高可读性,并确保程序中使用的变量只取预定义的合法值。 1. ...

    C#枚举中的位运算

    在C#中,枚举可以与位运算相结合,尤其在处理权限、标志或状态等场景中,这种结合能高效地进行计算和检查。本文将深入探讨C#枚举中的位运算,包括其基本概念、操作方法以及如何应用于权限管理。 首先,要理解位运算...

    Hibernate中映射枚举类型

    在Hibernate中映射枚举类型是一个常见的需求,利用好Hibernate提供的工具和自定义映射器可以让我们更加灵活地处理不同场景下的枚举类型映射需求。通过本文介绍的方法,我们可以轻松地将枚举类型的`name`、`ordinal`...

    第10章 结构体和共用体-7枚举类型1

    枚举类型还可以在结构体中作为字段使用,以表示特定的状态或标志。比如,定义一个人的婚姻状态: ```c struct person { char name[20]; char sex; int age; union maritalState marital; enum {SINGLE, ...

    第 结构体共用体和枚举类型PPT学习教案.pptx

    而枚举类型则常见于状态机、标志位集等场景,确保了代码的清晰和一致性。 总的来说,掌握结构体、共用体和枚举类型是编程能力提升的重要一步,它们能够帮助我们构建更加灵活和强大的程序。在学习过程中,理解它们的...

    Python-kPython的枚举类型支持库

    Python中的枚举(Enum)类型是程序设计中一种强大的工具,它允许我们创建一组具有特定值的命名常量。在Python标准库中,`...要深入了解k-Python的枚举类型支持库,需要查看具体的代码和文档来学习其具体实现和用法。

    C语言初学者入门讲座 第十四讲 枚举与位运算(1)

    在C语言学习过程中,枚举类型与位运算作为两个重要的基础概念,是初学者必须掌握的内容。本讲将详细介绍如何在C语言中使用枚举以及如何进行位运算,帮助初学者打好编程基础。 ### 枚举类型 枚举类型是一种用户定义...

    TypeScript中的类型安全字符串枚举

    字符串枚举是枚举类型的一种,它允许我们将枚举成员定义为字符串值,而不是默认的数字。 ```typescript enum StringEnum { Key1 = 'key1', Key2 = 'key2', Key3 = 'key3' } ``` 二、类型安全的优势 1. 防止...

    Java枚举数据类型.doc

    总结来说,Java枚举类型是为了解决传统整型枚举模式的不足而设计的,它提供了类型安全、良好的可读性和可扩展性,是编写高质量Java代码的重要工具。在实际开发中,应优先考虑使用枚举类型来定义固定的、有限的选项...

    C#枚举类型和结构体详解

    在实际应用中,枚举类型常用于简化开关、状态机和标志位等场景。例如,一个投票系统可以用枚举来表示候选人: ```csharp enum Candidate { ZhangSan = 1, LiSi = 2, WangWu = 3, ZhaoLiu = 4, FengQi = 5 } ``...

    CLR study学习文档

    在理解CLR的基础上,我们还需要掌握诸如类型基础(如基元类型、引用类型和值类型)、类和成员基础、常量和字段、方法、属性、事件、字符串、枚举类型和位标志、数组、接口、委托、泛型、自定义属性以及可空值类型等...

Global site tag (gtag.js) - Google Analytics