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(); } }