环境:
- 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
}
}
输出效果: