c#:枚举与位枚举

环境:

  • window 10
  • vs2019 16.5.1
  • .netcore 3.1.1

一、普通枚举

c#中的枚举本质上说是一个整数,但它同时和字符串又具有对应关系,可以从vs的提示中看出:
在这里插入图片描述
下面代码演示枚举与数字和字符串的相互转换:

public static void Main(string[] args)
{

    EnumDegree degree = EnumDegree.Normal;
    //枚举转数字
    Console.WriteLine($"枚举转数字 => {(int)degree}");
    //数字转枚举
    Console.WriteLine($"数字转枚举 => {Enum.Parse(typeof(EnumDegree), 0.ToString())}");
    //枚举转字符串
    Console.WriteLine($"枚举转字符串 => {degree.ToString()}");
    //字符串转枚举
    Console.WriteLine($"字符串转枚举 => {Enum.Parse(typeof(EnumDegree), "High")}");
    Console.WriteLine("ok!");
    Console.ReadLine();
}

public enum EnumDegree
{
    Low, Normal, High
}

输出效果:
在这里插入图片描述

二、位枚举(复合枚举)

因为c#中的枚举本身是数字,所以只要枚举的值只要是设置的恰当,完全可以表示多种状态。
首先看如下的使用方式:

class Program
{
    public static void Main(string[] args)
    {
        EnumTest test = EnumTest.First | EnumTest.Second;
        Console.WriteLine(test);
        Console.WriteLine($"test int:{(int)test}");
        Console.WriteLine($"test contains EnumTest.None =>{(test & EnumTest.None) != 0}");
        Console.WriteLine($"test contains EnumTest.First =>{(test & EnumTest.First) != 0}");
        Console.WriteLine($"test contains EnumTest.Second =>{(test & EnumTest.Second) != 0}");
        Console.WriteLine("ok!");
        Console.ReadLine();
    }
}

[Flags]
public enum EnumTest
{
    None = 1, First = 2, Second = 4
}

输出结果:
在这里插入图片描述
位枚举的理解:

  • 也称复合枚举,能同时表示多种状态
  • 需要在枚举定义上添加[Flags]特性
  • 可以当做普通枚举使用,即只存储单一状态
  • 设置的枚举值要能能适应位运算(看下面的解释)
  • 判断枚举状态是否包括某一值时要使用位运算符

这里主要解释下怎么恰当设置枚举的值:
我们直接将上面的枚举定义用二进制表示一下:

[Flags]
public enum EnumTest
{
    None = 0B0000_0001,//十进制:1
    First = 0B0000_0010,//十进制:4
    Second = 0B0000_0100//十进制:8
}

这样再回过头来看看想想“复合枚举的多状态是怎么存储的?怎么判断是否包含某个状态的?”
一目了然了吧!

三、[Flags]标记的作用

通过上面的分析,可能大家觉得,加不加[Flags]都一样,因为枚举本质上就是个整数吗,但是这种想法不可取,如果你想用位枚举(复合枚举)的话就老老实实的把[Flags]加上吧,看如下代码:

using System;
using System.Collections;
using System.Data;
using System.IO;
using System.Net;
using System.Threading;
using System.Threading.Tasks;

namespace TestDI
{
    class flagdemo
    {
        public static void flagtest()
        {
            for (int i = 0; i < 16; i++)
            {
                Console.WriteLine("{0}-{1}", i, (flagsdemo)i);
            }
            for (int i = 0; i < 16; i++)
            {
                Console.WriteLine("{0}-{1}", i, (single)i);
            }

            flagsdemo d = (short)flagsdemo.five + flagsdemo.three;

            Console.WriteLine(d);
        }
        public static void Main(string[] args)
        {
            flagtest();
            Console.WriteLine("ok");
            Console.ReadLine();
        }
    }

    [Flags]
    enum flagsdemo : short
    {
        one = 0,
        tow = 1,
        three = 2,
        four = 4,
        five = 8
    }

    enum single : short
    {
        one = 0,
        tow = 1,
        three = 2,
        four = 4,
        five = 8
    }
}

输出效果:
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值