• C# 枚举


    1、简单枚举

    • 枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal(只有在同一程序集的文件中,内部类型或成员才是可访问的)。
    • 枚举是值类型,隐式继承自System.Enum,不能手动修改。
    • 枚举都是隐式密封的,不允许作为基类派生子类。
    • 枚举类型的枚举成员均为静态,且默认为Int32类型。
    • 每个枚举成员均具有相关联的常数值。枚举成员不能相同,但枚举的值可以相同。

         要显示指定枚举的底层数据类型很简单,只需在声明枚举的时候加个冒号,后面紧跟要指定的数据类型。

     enum sex : byte  //显示指定枚举的底层数据类型
        { 
            male,
            female 
        }

         显式设置枚举的成员常量值,默认是从0开始,逐个递增的。但是以下例子却设置成了1,2,3,4,5,6,7,0。而且成员值可以一样的。

    enum Week
        { 
            Monday = 1,
            Tuesday = 2,
            Wednesday = 3,
            Sunday = 0,
         Everyday = 1  //成员的值可以设置成一样的,但是成员不行
        }
    Console.WriteLine((int)Week.Monday);  //获取值

         示例,由枚举值获取枚举名称与由枚举名称获取枚举值

    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Enum.GetName(typeof(Man),1));  //还是 刘备 (由值获取名字)
    
                string[] array1 = Enum.GetNames(typeof(Man));
                Console.WriteLine(array1[1]);   //关羽
    
                Array array2 = Enum.GetValues(typeof(Man));
                Console.WriteLine(array2.GetValue(1));  //还是关羽
    
                Type t = Enum.GetUnderlyingType(typeof(Man));
                Console.WriteLine(t);       //输出 Int32
    
                //由值获取内容
                int i = 1;
                string Name = Enum.Parse(typeof(Man), i.ToString()).ToString();     //此时 Name="刘备"
                Console.WriteLine(Name);
    
                //由值获取内容
                string Name2 = "关羽";
                int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2));     //此时 j=2
                Console.WriteLine(j);
    
                Console.ReadKey();
            }
        }
    
        enum Man
        { 
            刘备 = 1,
            关羽 = 2,
            张飞 = 3
        }

    2、标志枚举

      标志枚举要在顶部加[System.Flags]特性进行声明。而且枚举支持组合运算。

         1.只有要对数值执行按位运算(AND、OR、XOR)时才对枚举使用 FlagsAttribute 自定义属性。

         2.必须用 2 的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。

        先来看个例子

    class Program
        {
            static void Main(string[] args)
            {
                var man = Week.白 | Week.美;  //赋值为101    计算方法001或上100,结果是101
                Console.WriteLine((int)man);
                if ((man & Week.白) == Week.白)       //101 man 
                {                                    //001 白 逐位相与,
                    Console.WriteLine("此人白");      //001 如果结果是白,就可以反推出man包含 白
                }
                else
                {
                    Console.WriteLine("此人黑");
                }
                Console.ReadKey();
            }
        }
    
        [System.Flags或者Flags]
        public enum Week
        { 
            白 = 1,  //001
            富 = 2,  //010
            美 = 4,  //100
        }

    3、枚举使用的建议

    •       当参数、返回值、变量等类型可以使枚举,尽量使用枚举(要注意考虑分类的稳定性)
    •   大多数情况下都可以使用int类型枚举,下列情况除外。
    •   枚举可能被大量频繁的使用,这时为了节约空间可以使用小于int类型的枚举。
    •   标志枚举,且标志多于32个。
  • 相关阅读:
    Redis事务和锁
    11/6笔记 补充(Redis持久化,RDB&&AOF)
    11/6随笔
    Redis 安装教程
    Redis通用指令和第一个Jedis程序的实现
    Redis学习第二天
    SpringBoot学习笔记
    1000行代码手写服务器
    log4j创建实例异常
    寒假阅读人月神话3
  • 原文地址:https://www.cnblogs.com/sylone/p/6224918.html
Copyright © 2020-2023  润新知