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

輸出效果:
在這裏插入圖片描述

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