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
    }
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章