02011201 枚举

02011201 枚举

1. 枚举是什么

  • 枚举是由程序员定义的类型,与类或结构一样。
    • 枚举是值类型,因此直接存储它们的数据,而不是分开存储成引用或数据。
    • 枚举只有一种类型的成员,命名的整数值常量。
    • 注意,枚举成员声明列表时逗号分隔的列表,在枚举中没有分号。
// 枚举语法示例
enum TrafficLight
{
    Green, // 用“,”分隔,没有分号
    Yellow,
    Red
}

说明:
1. 每个枚举都有一个底层整数类型,默认为int。
2. 每个枚举成员都被赋予一个底层类型的常量值。
3. 在默认情况下,编译器对第一个成员赋值为0,对每一个后续成员赋的值都比前一个成员多1。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System; 

namespace Demo01
{
    enum TrafficLight
    {
        Green,
        Yellow,
        Red
    }

    class Program
    {
        static void Main()
        {
            TrafficLight t1 = TrafficLight.Green;
            TrafficLight t2 = TrafficLight.Yellow;
            TrafficLight t3 = TrafficLight.Red;

            Console.WriteLine($"{t1}, {(int)t1}"); // @1
            Console.WriteLine($"{t2}, {(int)t2}");
            Console.WriteLine($"{t3}, {(int)t3}");
            TrafficLight t4 = t3; // @2

            Console.ReadLine();
        }
    }
}

控制台输出:
Green, 0
Yellow, 1
Red, 2
Red, 2

说明:
1. 编译器把int值0、1、2分别赋值给成员Green、Yellow、Red,把它们转换成int类型,可以看到底层成员你的值。
2. TrafficLight t1 = TrafficLight.Green;
		↑ 	   ↑           ↑
        类型    变量 	    成员
3. 在@1处,将成员的字面量赋值给变量。
4. 在@2处,从相同的变量复制值。

2. 设置底层类型或显示值

  • 可以把“:”和类型名放在枚举名之后,这样就可以使用Int以外的整数类型(类型可以是任何整数类型)。
// 设置底层类型
                 冒号 底层类型
                  ↓   ↓
enum TrafficLight : ulong
{
    ...
}

说明:
1. 所有成员常量都属于枚举的底层类型,成员常量的值可以是底层类型的任何值。
2. 要显示的设置一个成员你的值,在枚举声明中的变量名之后使用初始化表达式。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 尽管不能有重复的名称,但是可以有重复的值。
enum TrafficLight
{
	Green = 10,
    Yellow = 15, // 重复的值
    Red = 15 // 重复的值
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 枚举的灯架声明
emum TrafficLight // @1
{
	Green,
    Yellow,
    Red
}

emum TrafficLight : int // @2
{
	Green = 0,
    Yellow = 1,
    Red = 2
}

说明:
1. 在@1和@2处声明的枚举两者是等价的。
2. 在@1处的代码接受默认的类型和编号;在@2处的代码显示的将底层类型设置为Int,并将吃呢公园环设置为与默认值相应的值。

3. 隐式成员编号

  • 可以显示的给任何成员常量赋值。如果不能初始化成员常量,编译器将隐式的给他赋一个值。
enum CardSuit
{
	Hearts, // 0 → 因为是第一项
    Clubs, // 1 → 比之前大1
    Diamonds, // 2 → 比之前大1
}

enum FaceCards
{
	Jack = 11, // 11 → 显式设置
    Queen, // 12 → 比之前大1
    King, // 13 → 比之前大1
    NumberOffFaceCards = 4, // 4 → 显式赋值
    SomeOtherValue, // 5 → 比之前大1
    HigthestFaceCard = King // 13 → 以上已经定义了King 
}

4. 位标志

  • 没看懂,先过。

5. Flags特性

  • 没看懂,先过。

6. 关于枚举的更多内容

  • 枚举只有单一的成员类型,即声明的成员常量。不能对成员使用修饰符,它们都隐式的具有和枚举相同的可访问性。
  • 由于枚举的成员是静态的,即使在没有该枚举类型的变量时可以访问它们。
using System; 

namespace Demo01
{
    enum TrafficLight
    {
        Green,
        Yellow,
        Red
    }

    class Program
    {
        static void Main()
        {
            Console.WriteLine($"{TrafficLight.Green}");
            Console.WriteLine($"{TrafficLight.Yellow}");
            Console.WriteLine($"{TrafficLight.Red}");

            Console.ReadLine();
        }
    }
}

控制台输出:
Green
Yellow
Red
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 和所有的静态类型一样,访问枚举的成员有两种方法。
// 1. 可以使用类型名称,后面跟“.”和成员名。
// 2. 可以使用using static指令来避免在每次使用时都包含类名。
using static TrafficLight;
...
Console.WriteLine($"{Red}"); // 不同过类名,直接访问。
  • 枚举是一个独特的类型,比较不同枚举类型的成员会导致编译时错误。
enum FirstEnum
{
    Mem1,
    Mem2
}

enum SecondEnum
{
    Mem1,
    Mem2
}
...
if(FirstEnum.Mem1 < FirstEnum.Mem2) // 正确,比较的是同一个枚举的不同成员。
    ...
if(FirstEnum.Mem1 < SecondEnum.Mem1) // 错误,比较的是不同枚举。
    ...

7. .NET Enum类型的静态方法

  • .NET Enum类型(enum类型就是基于该类型的)包括一些有用的静态方法。
    • GetName方法 → 以一个枚举类型对象和一个整数为参数,返回相应的枚举成员的名称。
    • GetNames方法 → 以一个枚举类型对象为参数,返回该枚举中所有成员的名称。
using System; 

namespace Demo01
{
    enum TrafficLight
    {
        Green,
        Yellow,
        Red
    }

    class Program
    {
        static void Main()
        {
            Console.WriteLine($"{Enum.GetName(typeof(TrafficLight), 1)}"); // 注意typeof返回的是对象。
            foreach (var name in Enum.GetNames(typeof(TrafficLight)))
                Console.WriteLine(name);

            Console.ReadLine();
        }
    }
}

控制台输出:
Yellow
Green
Yellow
Red

结尾

书籍:C#图解教程

著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔

译:窦衍森;姚琪琳

ISBN:978-7-115-51918-4

版次:第5版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

posted @ 2025-08-13 21:40  qinway  阅读(8)  评论(0)    收藏  举报