C#枚举进阶用法

总目录



一、基本使用

enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。

  • 默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。例如:
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
  • 在此枚举中,Sat 为 0,Sun 为 1,Mon 为 2,依此类推。枚举数可以具有重写默认值的初始值设定项。例如:
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

在此枚举中,强制元素序列从 1 而不是 0 开始。但是,强烈建议枚举包含一个值为 0 的常量。

  • 创建新的 Days 对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday (0)。创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。
  • 如果将负数定义为标志枚举常量,请小心,因为许多标志位置可能设置为 1,这可能会使代码混淆并引发编码错误。
  • 每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。枚举元素的默认基础类型为 int。若要声明另一整型枚举,例如 byte,请在标识符之后紧跟类型,然后再使用冒号:
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
  • 准许使用的枚举类型有 byte、sbyte、short、ushort、int、uint、long 或 ulong。

二、位标志枚举

  • 可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。(当然,某些组合在您的程序代码中可能没有意义或不允许使用。)

  • 创建位标志枚举的方法是应用 System.FlagsAttribute 属性并适当定义一些值,以便可以对这些值执行 AND、OR、NOT 和 XOR 按位运算

  • 以 2 的幂定义枚举常量,即 1、2、4、8 等。 这意味着组合枚举常量中的单个标志不重叠。

具体使用案例如下:

    [Flags]
    enum Days2
    {
        None = 0x0,
        Sunday = 0x1,
        Monday = 0x2,
        Tuesday = 0x4,
        Wednesday = 0x8,
        Thursday = 0x10,
        Friday = 0x20,
        Saturday = 0x40
       //以上16进制值 转化为10进制分别为 0,1,2,4,8,16,32,64
       //以 2 的幂定义枚举常量,即 1、2、4、8 等。 这意味着组合枚举常量中的单个标志不重叠。
    }
    internal class Program
    {
        
        static void Main(string[] args)
        {
            // 【标志位枚举的使用】
            //使用 | 运算符 取并集
            Days2 meetingDays = Days2.Tuesday | Days2.Thursday;

            meetingDays = meetingDays | Days2.Friday;

            Console.WriteLine("Meeting days are {0}", meetingDays);
            //经过两次 | 的运算,最后取得的并集是: Tuesday, Thursday, Friday

            //输出信息: Meeting days are Tuesday, Thursday, Friday

            //使用 & 是取交集,在此案例中 是取meetingDays 和Days2.Saturday的交集
            meetingDays &= Days2.Saturday;
            Console.WriteLine("Meeting days are {0}", meetingDays);
            //显然,二者并无交集
            //输出信息:Meeting days are None

            // 使用^ 是取差集,
            meetingDays = Days2.Tuesday | Days2.Thursday;//重新取并集
            meetingDays = meetingDays ^ Days2.Tuesday;
            Console.WriteLine("Meeting days are {0}", meetingDays);
            //输出信息:Meeting days are Thursday
            meetingDays|= Days2.Saturday;

            Days2 md = Days2.Wednesday | Days2.Sunday;
            meetingDays^= md;
            Console.WriteLine("Meeting days are {0}", meetingDays);
            //输出信息:Meeting days are Sunday, Wednesday, Thursday, Saturday

            //若要确定是否设置了特定标志,请使用逻辑 AND 运算
            // 当我们需要判断是否在某个枚举组合中,可以使用&,具体运用如下:
            bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
            Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
            // Output: Thursday is a meeting day.
            Console.ReadKey();
        }
    }
  • 给Enum定义Flag 特性 和不定义Flag的区别如下:
    [Flags]
    enum Color1
    {
        None=0,
        Red = 1,
        Green = 2,
        Blue = 4,
        Yellow = 8,
    }

    enum Color2
    {
        None = 0,
        Red = 1,
        Green = 2,
        Blue = 4,
        Yellow = 8,
    }
    internal class Program
    {
        
        static void Main(string[] args)
        {
            var or1 = Color1.Green | Color1.Blue;
            var or2 =Color2.Green | Color2.Blue;
            Console.WriteLine($"【or1={or1}】--【or2={or2}】");
            //【or1=Green, Blue】--【or2=6】
            //or1 是做并集, or2 的计算过程如下
            //Color2.Green ==>2==>  0000 0010
            //Color2.Blue  ==>4==>  0000 0100
            //==================================没有Flag特性标签则按 或位运算符运算
            //均为0则为0,其余为1   0000 0110   ===》转为10进制 结果为6                 

            var and1 =(Color1.Blue|Color1.Green) & Color1.Green;
            var and2= (Color2.Blue | Color2.Green) & Color2.Green;
            Console.WriteLine($"【and1={and1}】--【and2={and2}】");
            //【and1 = Green】--【and2 = Green】
            Console.ReadKey();
        }
    }

通常可以将位标志枚举应用于系统权限中


结语

以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。

参考资料:
enum(C# 参考)
枚举类型(C# 编程指南)
FlagsAttribute 类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,枚举类型用于声明一组命名的常量,可以用于表示一系列相关的值。我们可以使用enum关键字来定义一个枚举类型。 举个例子,我们可以创建一个表示星期的枚举类型,命名为"Weekday"。在这个枚举类型中,我们可以列举出一周的所有天,从星期一到星期日。 下面是一个示例代码: enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 在这个枚举类型中,每个枚举值都会被默认赋予一个递增的整数值,从0开始。所以,在上面的例子中,Monday的值为0,Tuesday的值为1,依此类推。 如果我们想要为某个枚举值指定一个特定的整数值,我们可以使用赋值运算符来为其赋值。例如,我们可以将Monday的值指定为1: enum Weekday { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 这样,Monday的值就为1,而Tuesday的值为2,以此类推。 通过使用枚举类型,我们可以更加直观地表示一组相关的值,并且可以方便地进行比较和操作。在实际应用中,我们可以利用枚举类型来表示类似星期、性别、状态等离散的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [详细了解C# 枚举与位枚举](https://download.csdn.net/download/weixin_38743391/13709210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C# 枚举(Enum)精讲](https://blog.csdn.net/qq_44034384/article/details/106558683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C#枚举进阶用法](https://blog.csdn.net/qq_39847278/article/details/129407395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值