枚举(enumerate)



1. 什么是枚举

  枚举是程序员自己定义的类型,与类和结构一样。   ■ 与结构一样,枚举是值类型,因此直接存储它们的数据,而不是分成引用和数据去存储。   ■ 不能对枚举成员使用修饰符,它们都隐式的具有和枚举相同的可访问性。   ■ 枚举只有一种类型的成员:命名的整数值常量。

1
2
3
4
5
6
7
//声明枚举的关键字是“enum”
enum TrafficLight
{
    Green,  //成员之间用逗号分隔
    Yellow,  
    Red
}

每一个枚举类型都有一个底层整数类型,默认为int。   ■ 每一个枚举成员都被赋值一个默认的int类型的常量值。   ■ 编译器把第一个成员默认的赋值为0,此后每一个成员都在前一个成员的基础上多1。

1
2
3
4
5
6
7
8
9
TrafficLight t1 = TrafficLight.Green;
TrafficLight t2 = TrafficLight.Yellow;
TrafficLight t3 = TrafficLight.Red;

//将枚举成员强制转换成int类型的底层整数值
Console.WriteLine("{0}---{1}",t1,(int)t1);
Console.WriteLine("{0}---{1}",t2,(int)t2);
Console.WriteLine("{0}---{1}",t3,(int)t3);
Console.ReadKey();

运行结果: 枚举的成员常量被底层整数值表示:   可以把枚举值赋值给枚举类型的变量。

1
2
3
4
TrafficLight t1 = TrafficLight.Green;
TrafficLight t2 = TrafficLight.Yellow;
//将枚举值赋值给枚举类型的变量
TrafficLight t3 = t2;

2. 设置底层类型和显式值

  可以修改枚举类型的底层类型,可以使用冒号和类型名使枚举的底层类型使用char以外的任何整数类型。

1
2
3
4
5
//将底层类型由默认的int修改成ulong
enum TrafficLight : ulong
{
    ...
}

  成员常量的值可以显式的设置,可以在枚举声明的时候进行初始化成员常量的值,枚举不能有重复的名称,但是可以有重复的成员常量值。

1
2
3
4
5
6
enum TrafficLight
{
    Green = 10,
    Yellow = 15,
    Red = 15
}

3. 隐式成员编号

可以显式的给任何成员常量赋值,如果没有赋值,编译器会隐式的给它赋一个值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
//编译器默认赋值
enum CardSuit
{
    Hearts,       //0
    Clubs,        //1
    Diamonds,     //2
    Spades,       //3
    MaxSuits      //4
}

//显式的赋值
enum FaceCards
{
    Jack = 11,             //11
    Queen,                 //12 (在前一个的基础上多1)
    King,                  //13
    Ace,                   //14
    NumberOfFaceCards = 4, //4
    SomeOtherValue,        //5
    HighesFaceCard = Ace   //14 
}

成员赋值的法则:

4. 枚举成员可以直接使用

  由于枚举成员是常量,所以可以不用创建枚举类型的变量,直接使用枚举成员。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
enum MyEnum
{
    one,
    two,
    three
}
class Program
{
    static void Main(string[] args)
    {
        //没有创建枚举变量,可以直接使用枚举成员
        Console.WriteLine("{0}",MyEnum.one);
        Console.WriteLine("{0}",MyEnum.two);
        Console.WriteLine("{0}",MyEnum.three);
    }
}

运行结果:

4.1. 不同枚举类型的成员之间无法比较

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
enum FirstEnum
{
    Mem1,
    Mem2
}

enum SecondEnum
{
    Mem1,
    Mem2
}

class Program
{
    static void Main(string[] args)
    {
        if(FirstEnum.Mem1 < FirstEnum.Mem2)
        {
            //正确,相同的枚举类型进行比较
        }
        if(FirstEnum.Mem1 < SecondEnum.Mem1)
        {
            //错误,不同的枚举类型进行比较会发生编译期错误
        }
    }
}