環境:
- 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
}
}
輸出效果: