菜鸟教程 -- 学的不仅是技术,更是梦想!

C# 教程
(追記) (追記ここまで)

C# 枚举(Enum)

枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。

C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。

声明 enum 变量

声明枚举的一般语法:

enum <enum_name>
{ 
 enumeration list 
};

其中,

  • enum_name 指定枚举的类型名称。
  • enumeration list 是一个用逗号分隔的标识符列表。

枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0.例如:

enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

实例

下面的实例演示了枚举变量的用法:

实例

using System;

public class EnumTest
{
enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

static void Main()
{
int x = (int)Day.Sun;
int y = (int)Day.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}

当上面的代码被编译和执行时,它会产生下列结果:

Sun = 0
Fri = 5
AI 思考中...

13 篇笔记 写笔记

  1. #0

    Tommy Peng

    tom***[email protected]

    139

    枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。

    但是,你也可以自定义每个符号的值:

    using System;
    namespace EnumApplication
    {
     class EnumProgram
     {
     enum Days {
     Mon=71, 
     tue=61, 
     Wed=51, 
     thu=41, 
     Fri=51, 
     Sat=61, 
     Sun=71
     };
     static void Main(string[] args)
     {
     int WeekdayStart = (int)Days.Mon;
     int WeekdayEnd = (int)Days.Fri;
     Console.WriteLine("Monday: {0}", WeekdayStart);
     Console.WriteLine("Friday: {0}", WeekdayEnd);
     Console.ReadKey();
     }
     }
    }
    

    输出结果:

    Monday: 71
    Friday: 51

    Tommy Peng

    tom***[email protected]

    9年前 (2017年07月19日)
  2. #0

    长风

    126***[email protected]

    114

    枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。第 n 个符号值与第 n-1 个有关。

    using System;
    class Program
    {
     enum Day {a=8,b,c=1,e,f,g};
     static void Main(string[] args)
     {
     int a = (int)Day.a;
     int b = (int)Day.e;
     Console.WriteLine(a);
     Console.WriteLine(b);
     Console.ReadKey();
     }
    }

    结果:

    8
    2

    长风

    126***[email protected]

    9年前 (2017年10月18日)
  3. #0

    _mBreak

    709***[email protected]

    88

    枚举体在给数组中具体标号位置给予含义是使用,可以使程序更容易读懂和修改。

    enum len { Length, width, height};
    static void Main(string[] args)
    {
     int[] parameter = new int[3] {1,5,8};
     Console.WriteLine("Length: {0}", parameter[(int)len.Length]);
     Console.WriteLine("width: {0}", parameter[(int)len.width]);
     Console.WriteLine("height: {0}", parameter[(int)len.height]);
    }

    此时可以一眼看出打印值为参数的长宽高。

    相对于使用

    #define length 0
    #define width 1
    #define height 2

    该方式在插入一个参时更方便:

    #define area 0
    #define length 1
    #define width 2
    #define height 3
    enum len {area, Length, width, height};

    很明显使用Enum方式更容易更改。

    _mBreak

    709***[email protected]

    9年前 (2017年10月20日)
  4. #0
    83

    位标志枚举(flags enumeration)

    现实中不总是用离散值枚举,以一周中的7天为例,假设要求应用程序用户指定一周中各天的任意组合,便可以使用"位标志枚举"。使用位标志枚举时,可以用或运算创建新的组合值。以星期为例,声明方法如下:

    [Flags]
    public enum Days
    {
     None = 0,
     Sunday = 0x01, //0000 0001
     Monday = 0x02, //0000 0010
     Tuesday = 0x04, //0000 0100
     Wednesday = 0x08, //0000 1000
     Thursday = 0x10, //0001 0000
     Friday = 0x20, //0010 0000
     Saturday = 0x40, //0100 0000
     Weekend = Sunday | Saturday, //0100 0001
     Workdays = Monday | Tuesday | Wednesday | Tuesday | Friday, //0011 1110
    }

    为了让位标志枚举的值能够组合,所有值都必须是2的幂。因为组合多个值时,必须能确定结果为哪个离散值。

    在简单枚举中,可以让名称None或最常用默认名称对应于0,但标志枚举要求0对应于名称None,这个值意味着所有标志都未设置。

    执行:

    Days days = Days.Weekend;
    Console.WriteLine("{0} : {1}",days,(int)days);

    结果输出:

    Weekend : 65
    9年前 (2018年01月07日)
  5. #0

    JiangCY

    158***[email protected]

    35
    Enum Gender
    {
     Male = 1,
     , Female = 0
    }
    Gender gender = Gender.Male;
    // Enum => int
    int genderId = (int)gender; // 1
    // int => Enum
    Gender gender1 = (Gender)0; // Female,超出枚举数值范围返回数值本身
    // Enum => string
    string genderStr = gender.ToString(); // Male
    // string => Enum
    Gender gender2 = (Gender)Enum.Parse(typeof(Gender), "Female"); // Gender.Female,超出字符串范围报错

    JiangCY

    158***[email protected]

    8年前 (2018年12月28日)
  6. #0

    Killen

    153***[email protected]

    40

    枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。但你也可以設定每個符號的值,如果字符 n 你沒有設定值,他的值就是字符 (n-1)+1,舉個例子:比如枚舉字符 g,他的值就是字符 f 的值 +1,但由於 f 的值不知道,他就會去找第(n-1)的值,也就是 e 的值,以此類推,找到了 c 的值 1,e=c+1=2,f=e+1=3,g=f+1=4;

    using System;
    class Program
    {
     enum Day {a=8,b,c=1,e,f,g};
     static void Main(string[] args)
     {
     int a = (int)Day.a;//8
     int x = (int)Day.b;//9
     int c = (int)Day.c;//1
     int b = (int)Day.e;//2
     int g = (int)Day.g;//4
     }
    }

    默认情况下,第一个枚举符号的值是 0。

    using System;
    class Program
    {
     enum Day { a, b, c, e = 1, f, g };
     static void Main(string[] args)
     {
     int a = (int)Day.a;//0
     int x = (int)Day.b;//1
     int c = (int)Day.c;//2
     int b = (int)Day.e;//1
     int g = (int)Day.g;//3
     }
    }

    Killen

    153***[email protected]

    7年前 (2019年05月17日)
  7. #0

    kevinchankwong11

    che***[email protected]

    31

    枚举中的每一个数字都是整数型,如果不给任何一个元素赋值的话,那么是默认从 0 开始以 1 为单位的增长,如果全部赋值,那么也不用说上面分享笔记的同学已经说过了这种情况,我想说一说在列举元素内部元素赋值的情况(非首尾的元素),以列举元素第N位,我们赋值为 a,那么运行结果是 Mon=1、Fri=22,所以由此可知,在赋值的元素之前,仍然服从默认赋值规律,从 0 开始以 1 为 increment 的增长知道第 N-1 位,但是从赋值的 N 位开始,以其值 a 为起点的 increment 为 1 的增长,即:a+1,a+2,a+3....

    using System;
    public class EnumTest
    {
     enum Day { Sun, Mon, Tue=19, Wed, Thu, Fri, Sat }; /*列举其中的元素*/
     static void Main()
     {
     int x = (int)Day.Mon;
     int y = (int)Day.Fri;
     Console.WriteLine("Mon = {0}", x); /*一般数组中默认的数值第一个就是0,其后是一次增大的,但是也是可以对数组中的每个元素进行赋值*/
     Console.WriteLine("Fri = {0}", y);
     Console.ReadKey();
     }
    }

    kevinchankwong11

    che***[email protected]

    7年前 (2019年10月14日)
  8. #0

    maanshancss

    w1-***qq.com

    参考地址

    54

    同上面那位我点赞的同学一样说下位枚举的一个实例;

    //1、给用户创建、读取,修改和删除的权限
    var parmission = Permission.Create | parmission.Read | parmission.Update | parmission.Delete;
    //2、去掉用户的修改和删除权限
    parmission = parmission &~parmission.Update;
    parmission = parmission &~parmission.Delete;
    //3、给用户加上修改的权限
    parmission = parmission | parmission.Update;
    //4、判断用户是否有创建的权限
    var isCreate = (parmission & parmission.Create)!=0;
    //或者
    var isCreate = (parmission & parmission.Create)==parmission.Create;
     这时parmission枚举的值将变成0+1+4=5,它的ToSting()将变成“parmission.Create,
     parmission.Read”,parmission.Update; 这里我们可以解释为什么第五个值Delete是8而不能成为5。
     也就是说它的值不应该是前几项值的复合值。一个比较简单的方法
     就是用2的n次方来依次位每一项赋值,例如:1,2,4,8,16,32,64.......。

    maanshancss

    w1-***qq.com

    参考地址

    7年前 (2019年11月29日)
  9. #0

    maanshancss

    w1-***qq.com

    28

    推荐:

    枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。

    说明: 枚举其实就是特殊的常量类,且构造方法被默认强制是私有。

    正例: 枚举名字: DealStatusEnum, 成员名称: SUCCESS / UNKOWN_REASON

    maanshancss

    w1-***qq.com

    7年前 (2019年11月29日)
  10. #0

    胡桃

    266***[email protected]

    32
    • 枚举是一种类型
    • 适用于某些取值范围有限的数据,例如:我只想要春夏秋冬这四个字符的取值范围,如果用string的话就无法固定取值范围
    • 枚举语法:[访问权限修饰符] enum 枚举名 { 枚举值 }
    • 枚举访问权限修饰符和类是一样的,默认访问权限和类一样都是internal
    • 枚举名遵循大驼峰命名法
    • 枚举的每一个值都是一个整型,默认都是从 0 开始

    以上特点上面笔记都差不多都说,然后还有两点:

    • 1、枚举中的元素的值可以设置为相同,但不推荐。
    • 2、枚举元素默认的值的类型是 int 型,可以修改为其他整型 byte、sbyte、short、ushort、int、uint、long 和 ulong。
    public enum Season_1
    {
     spring_1 = 3, //3
     sunmmer_1, //4
     autumn_1 = 3, //3
     winter_1 //4
    }
    public enum Season_2 : long //将枚举默认类型int改为long
    {
     spring_2, //0
     sunmmer_2, //1
     autumn_2, //2
     winter_2 //3
    }
    class Program
    {
     static void Main(string[] args)
     {
     Season_1 s2 = Season_1.autumn_1;
     Console.WriteLine(s2); //显示spring_1,而不是autumn_1的原因是spring_1和autumn_1都是3,从前往后 //第一个3是spring_1,所以就输出spring_1
     Season_1 s3 = Season_1.spring_1;
     Console.WriteLine(s2 == s3); //结果是true,表明spring_1和autumn_1是一样的
     }
     }

    胡桃

    266***[email protected]

    7年前 (2020年01月14日)
  11. #0

    王小黑

    841***[email protected]

    15

    1、枚举可以像是作者在类中直接声明、引用。

    public class EnumTest
    { 
     enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
    }

    2、也可以在类外使用

    public enum CustomType // 如果是类外写,按照命名规则我们最好在后边加上 Type 字样
    {
     Sun = -1, // 如同文中所说,默认为 0,但我们可以改成我们自己想要的 
     Mon, 
     Tue, 
     Wed = 10, // 当然我们也可以不按照规则,给他主动往上加、往下减,都是可以的
     Thu = -5, 
     Fri, 
     Sat
    }
    public class EnumTest
    { 
     CustomType Day = CustomType.Sun;
    }

    当然这两种写法全看代母使用场景,随机应变。

    转换:

    文中已经提到了(int)转换,所以 int 转为 enum 只需要(enum),当然还有别的办法,请大佬们直接分享一下。

    public class EnumTest
    { 
     int number = 10;
     CustomType Day = CustomType.Sun;
     
     Console.WriteLine((enum)number); //int转换为enum
     Console.WriteLine((int)Day); //enum转换为int
     Console.WriteLine(Day.ToString()); //enum转换为string
    }

    最后上边的内容分别为:

    Wed 
    -1
    Sun

    王小黑

    841***[email protected]

    5年前 (2021年03月09日)
  12. #0

    我搬砖养你啊

    126***[email protected]

    11

    针对@第 2 个笔记 ,做一个更为直观的实例展示。

    枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。第 n 个符号值与第 n-1 个有关。

    using System;
    class Program
    {
     enum Day {a=8,b,c=1,e,f,g};
     static void Main(string[] args)
     {
     int l = (int)Day.a;
     int m = (int)Day.b;
     int n = (int)Day.c;
     int x = (int)Day.e;
     int y = (int)Day.f;
     int z = (int)Day.g;
     Console.WriteLine(l);
     Console.WriteLine(m);
     Console.WriteLine(n);
     Console.WriteLine(x);
     Console.WriteLine(y);
     Console.WriteLine(z);
     Console.ReadKey();
     }
    }

    上面的代码运行结果为:

    8
    9
    1
    2
    3
    4

    我搬砖养你啊

    126***[email protected]

    5年前 (2021年05月20日)
  13. #0

    hopeitdoes

    257***[email protected]

    19

    我们可以使用枚举位标志将多个枚举组合成单个值。提到枚举位标志就不能不提到Flags特性。

    简单来说它可以让枚举更智能,对位标志的值提供更智能的格式化。例如:

    public enum a:byte
    {
     None=0b_0000_0000,
     apple=0b_0000_0001,
     banana=0b_0000_0010,
     watermelon=0b_0000_0100,
     pineapple=0b_0000_1000 
    }

    当你把apple以及banana设置在一起时,编译器会所输出3。而加了Flags的话,编译器就会知道这是1+2=3。从而输出apple以及banana。

    using System;
    namespace HelloWorldApplication
    {
     class A
     {
     [Flags]
     public enum a:byte//这种格式的值大家应该都看得懂的吧,对吧
     {
     None=0b_0000_0000,
     apple=0b_0000_0001,
     banana=0b_0000_0010,
     watermelon=0b_0000_0100,
     pineapple=0b_0000_1000 
     }
     static void Main(string[] args)
     {
     a bb=a.apple|a.banana;//设置多个位标志
     Console.WriteLine(bb);
     Console.ReadKey();
     }
     }
    }

    我们用位或(|)来设置多个位标志:

    a bb=a.apple|banana|watermelon;

    还可以用位与(&)来检查特定位是否被标志

    a bb=a.banana|a.watermelon;
    bool cha=(bb&a.apple)==a.apple;

    hopeitdoes

    257***[email protected]

    4年前 (2022年02月05日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /