C#学习笔记 -- 枚举

枚举

枚举

枚举是开发者定义的类型, 与类、结构一样

  • 与结构一样, 枚举是值类型, 因此直接存储他们的数据, 而不是分开存储成引用和数据

  • 枚举只有一种类型的成员: 命名的整数值常量

enum TrafficL
{
    Green, Red, Yellow
}
  • 每个枚举类型都有一个底层整数类型, 默认为int

  • 每个枚举成员都被赋予一个底层类型的常量值

  • 默认情况下, 编译器对第一个成员赋值为0, 对每一个后续成员赋值都比前一个成员多1

比如此例, 编译器把int赋值给成员, 成员在栈中

enum TrafficLight
{
    Green,
    Yellow,
    Red
}
static void Main(string[] args)
{
    TrafficLight t1 = TrafficLight.Green;
    TrafficLight t2 = TrafficLight.Yellow;
    TrafficLight t3 = TrafficLight.Red;
    Console.WriteLine($"{t1}, {(int) t1}");
    Console.WriteLine($"{t2}, {(int) t2}");
    Console.WriteLine($"{t3}, {(int)t3}");
    //Green 0   Yello 1   Red 2
}

可以把枚举值付给枚举类型变量, 可以把成员字面量f赋给变量, 或者从另一个相同类型变量的变量复制值

static void Main(string[] args)
{
    TrafficLight t1 = TrafficLight.Red;
    TrafficLight t2 = TrafficLight.Green;
    TrafficLight t3 = t2;
    Console.WriteLine(t1);
    Console.WriteLine(t2);
    Console.WriteLine(t3);
    //Red Green Green
}

(1)设置底层类型和显式值

可以把冒号的类型名放在枚举名之后, 这样就可以使用int以外的整数类型, 类型可以是任何整数类型

enum TrafficLight : ulong
{
    ...
}
  • 成员常量的值可以是底层类型的任何值

  • 显式地设定一个成员的值, 在枚举声明中的变量名之后使用初始化表达式

  • 名称不能重复, 但值可以重复

enum TrafficLight
{
    Green,
    Yellow,
    Red
}
enum TrafficLight : int
{
    Green = 0,
    Yellow = 1,
    Red = 2
}

(2)隐式成员编号

如果不初始化成员常量, 编译器将隐式地给他赋一个值, 规则如下

enum FaceCard
{
    Jack = 11; //显式赋值 11
    Queen; //12
    King; //13
    Ace; //14
    NumberOfFaceCards = 4; //显式赋值 4
    SomeOtherValue; //5
    HightestFaceCard = Ace; //14
}

(3)枚举的成员

枚举只有单一的成员类型: 声明的成员常量

  • 不能对成员使用修饰符, 他们都隐式地具有和枚举相同的可访问性

  • 成员是静态的, 即使在没有该枚举类型的变量时也可以访问他们

(4)访问枚举成员

和所有的静态类型一样, 访问枚举的成员有两种方法

  • ExampleEnum.ExampleCons

  • 使用using static

    enum TrafficLight
    {
        Green,
        Yellow,
        Red
    }
    using static TrafficLight;
    static void Main()
    {
        Console.WriteLine(Green);
        Console.WriteLine(Yellow);
        Console.WriteLine(Red);
    }

(5)枚举比较

枚举是一个独特的类型, 比较不同枚举类型的成员会导致编译错误

enum FirstEnum
{
    Mem1,
    Mem2
}
enum SecondEnum
{
    Mem1,
    Mem2
}
static void Main(string[] args)
{
    if(FirstEnum.Mem1 < FirstEnum.Mem2)
    {
        Console.WriteLine("true");
    }
    if(FirstEnum.Mem1 < SecondEnum.Mem2) //编译错误, 枚举类型不同
    {
        Console.WriteLine("true");
    }
}

(6)doNET的枚举

C#的enum基于doNET的Enum类型, doNET Enum类型中静态方法

  • GetName, 以一个枚举类型对象和一个整数为参数, 返回相应的枚举成员的名称

  • GetNames方法以一个枚举类型对象位参数, 返回该枚举中的所有成员的名称

enum TrafficLight
{
    Green,
    Yellow,
    Red
}
static void Main(string[] agrs)
{
    Console.WriteLine($"TrafficLight的第一个成员是: {Enum.GetName(typeof(TrafficLight), 1)}");
    int i = 1;
    foreach (var name in Enum.GetNames(typeof(TrafficLight)))
    {
        Console.WriteLine($"TrafficLight的第{i++}个成员是: {name}");
    }
}

posted on 2023-05-26 00:22  老菜农  阅读(24)  评论(0编辑  收藏  举报

导航