c#中的数据类型简介(枚举)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中的数据类型简介(枚举)相关的知识,希望对你有一定的参考价值。

C#中的数据类型简介(枚举)

枚举的定义

根据MSDN上给出的定义,枚举是一个指定的常数集,其基础类型可以是除Char外的任何整型。 如果没有显式声明基础类型,则使用 Int32。 Enum 是 .NET Framework 中所有枚举的基类。其基础类型可以是byte、sbyte、short、ushort、int、unit、long、ulong。默认情况下,第一个枚举数的值为0,然后后续的枚举数依次加1。

枚举的申明

枚举可以申明在命名空间下和类同级别,也可申明在类的内部。申明语法如下:

[access modifiers] enum <identifier> [:enum_base]

{

enum body

}

Access modifiers : 定义访问修饰符,只能是public和internal,默认internal

Identifier:定义枚举的名称

Enum_base:定义枚举整数的类型,默认是int(可以定义除Char外的任何整数类型,详见上面枚举的定义段)

namespace enumDemo
{
    enum Color:byte  //基础类型为byte
    {
        Red,
        Orange,
        Yellow,
        Green,
        Cyan,
        Blue,
        Purple,     //可以省略逗号
    };              //可以省略分号

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
    enum Color:byte  //基础类型为byte
    {
        Red=2,       //可以用基础数重定义默认值,Red基础数定义从2开始,那么Orange基础数为3,后续常量值依此类推,
//但是建议基础数据定义包含默认值,否则枚举的实例化可能会出现问题
Orange, Yellow, Green, Cyan, Blue, Purple, };

实例化枚举类型

实例化枚举值可以有三种方法

1,直接赋值为枚举常量

2,通过枚举值转化赋值

3,通过构造函数实例化枚举值

    class Program
    {
        static void Main(string[] args)
        {
            Color myColor = Color.Yellow;      //赋值枚举常量
            Color myColor1 = (Color)4;         //赋值枚举值,然后转为枚举常量
            Color myColor2 = new Color();      //构造函数的初始化,myColor2赋值的枚举值为0,但是Color枚举的最小值为2,是一个非法值
            Console.WriteLine("my color is {0}, color value is {0:D}",myColor);
            Console.WriteLine(myColor1);
            Console.WriteLine("my color is {0},color value is {1} " ,(Color)myColor2,myColor2);
            Console.Read();
        }
    }

枚举类型的转化

System.Enum 类型是所有枚举类型的抽象基类(它是一种与枚举类型的基础类型不同的独特类型),并且从 System.Enum 继承的成员在任何枚举类型中都可用。存在从任何枚举类型到System.Enum 的装箱转换,并且存在从 System.Enum 到任何枚举类型的取消装箱转换。System.Enum 本身不是枚举类型。相反,它是一个类类型,所有枚举类型都是从它派生的。类型 System.Enum 从类型 System.ValueType派生,而后者又从类型 object 派生。在运行时,类型 System.Enum 的值可以是 null 或是对任何枚举类型的装了箱的值的引用。

    class Program
    {
        static void Main(string[] args)
        {
            Color color1 = (Color)6;             // 将整数转化为枚举常量
            int int1 = (int)Color.Green;         // 将枚举常量转化为整数
            Console.WriteLine(int1);
            string[] format = { "G", "F", "X", "D" };
            foreach (string f in format)
            {
                string colorStr = color1.ToString(f); //格式化输出
                Console.WriteLine(colorStr);
            }
            Console.WriteLine("Color Format is: {0}",  Enum.Format(typeof(Color), (byte)7, "G"));      //通过format方法格化将枚举值转为string
            Console.WriteLine("Color Constant is :{0}", Enum.GetName(typeof(Color), (byte)8));         //通过GetName方法将枚举值转化为string,8默认是int类型需转化为Color的基础类型byte
            foreach (string item in Enum.GetNames(typeof(Color)))          //通过GetName方法将枚举转化为string数组
                Console.WriteLine("Color Name Constant is :{0}", item);
            
            foreach (Color item in Enum.GetValues(typeof(Color)))          //通过GetValues方法转化为Color常量
                Console.WriteLine("Color value is {0}", item);
            if  (Enum.IsDefined(typeof(Color), (byte)4))
                Console.WriteLine("the value 4‘s constant is {0}", Enum.Parse(typeof(Color),"4"));
            else
                Console.WriteLine("the 4 value is not define");
            Color color2 = (Color)Enum.ToObject(typeof(Color), 4);         //通过ToObject方法将整数值转化为枚举常量
            Console.WriteLine(color2);
            Color color3;
            if (Enum.TryParse("2", out color3))                            //通过TryParse试做将字符串转换为枚举常量
                Console.WriteLine("The value 2 is Defined: {0}",color3);
            else
                Console.WriteLine("The value 2 is not Defined");

            if (Enum.TryParse("BLACK", out color3))                         //通过TryParse试做将字符串转换为枚举常量
                Console.WriteLine("The CONSTANT BLACK is Defined: {0}", color3);
            else
                Console.WriteLine("The CONSTANT BLACK is not Defined");
            Console.Read();
        }
    }

位运算

在枚举的申明上面加上[Flags]特性

 

    class Program
    {
        [Flags]
        enum familyPets
        {
            None = 0x0,  //定义16进制的0
            Dog = 0x01,  //定义16进制的1
            Cat = 0x02, 
            Bird = 0x04,
            Duck = 0x08,
        };

        static void Main(string[] args)
        {
            familyPets fp = familyPets.Dog | familyPets.Cat;
            Console.WriteLine("Pets: {0:G} ({0:D})", fp);   //显示结果Dog,Cat(3),16进制1和2按位或运算结果为3
            if (fp.HasFlag(familyPets.Cat))                 //判断fp是否定义位域Cat
               Console.WriteLine("有宠物猫。");
            else
                Console.WriteLine("没有宠物猫。");

            if ((fp & familyPets.Dog) == familyPets.Dog)    //fp和Dog位域按位与运算
                Console.WriteLine("有宠物Dog。");
            else
                Console.WriteLine("没有宠物Dog。");

            if (fp == familyPets.None)                      //fp位运算的结果为3,不为0
                Console.WriteLine("家庭里没有宠物。");
            else
                Console.WriteLine("家庭里有宠物。");                   
            Console.Read();
        }
    }

以上是关于c#中的数据类型简介(枚举)的主要内容,如果未能解决你的问题,请参考以下文章

自定义枚举作为 C# 中的应用程序设置类型?

c#中怎样定义枚举?

c语言中的枚举型啥意思

c语言中的枚举型啥意思

C#中,定义了一个枚举,怎么用for循环来遍历枚举中的每个值?

c#下可否将一个枚举类型的数组转换为一个整型数组