枚舉類型與位運算


目錄

  • 枚舉
  • 位運算

一、枚舉

枚舉類型是名稱與值的組合。

枚舉類型是值類型。

1、為什么枚舉類型是名稱與值得組合?有時我只看到鍵名稱,沒有看到相對的值。

public enum Options
{
            Insert,
            Update,
            Save,
            Delete,
            Query
}

編譯器會給上面補充完整

public enum Options
{
            Insert=0,
            Update=1,
            Save=2,
            Delete=3,
            Query=4
}

默認從0開始,依次賦值。

2、為什么枚舉類型是值類型

因為System.Enum派生於System.ValueType,而System.ValueType直接派生自System.Object

編譯器遇到枚舉類型時,會有自己的理解:

internal struct Options:System.Enum
 {
            public const Options Insert = (Options)0;
            public const Options Update = (Options)1;
            public const Options Save = (Options)2;
            public const Options Delete = (Options)3;
            public const Options Query = (Options)4;
            public int value__;
}

雖然Enum類型不能繼承,但是可以看出編譯器對待枚舉類型所形成自己的理解,讓我們明白其原理。

3、操作枚舉類型

(1) GetUnderLyingType:返回容納一個枚舉類型的值的基礎類型

每個枚舉類型都有一個基礎類型,默認是int.所以上面編譯器默認為我們填充int類型的值0~4。

當然這個基礎類型也可以自己指定,可以為byte\sbyte\short\usshot\int\uintr\long\ulong

public enum Options:byte
{
            Insert,
            Update,
            Save,
            Delete,
            Query
}
var type= Enum.GetUnderlyingType(typeof(Options));

 string strs = type.ToString();

枚舉類型是基元類型,我們可以對其實例進行許多平時的操作符操作,而每個枚舉實例,對應着value__字段。

 

(2)GetValues:獲取一個數組,該數組的每個元素都包含鈣元素的名稱和對應的值。

System.Collections.Generic.Dictionary<int,string> opsDic=new     System.Collections.Generic.Dictionary<int,string>();
Options[] ops = (Options[])Enum.GetValues(typeof(Options));
foreach (var o in ops)
{
                try
                {
                    opsDic.Add((int)o, o.ToString());
                }
                catch (Exception ex)
                {
                    Console.WriteLine("鍵值{0}已存在", (int)o);
                }
}    


(3)GetNames:返回一組字符串名稱數組。

string[] opsNames = Enum.GetNames(typeof(Options)); 

(4)Parse和TryParse:可以將數值和名稱的字符串轉換成對應的枚舉類型。

Options turnOption = (Options)Enum.Parse(typeof(Options), "Insert");
Options turnOption1 = (Options)Enum.Parse(typeof(Options), "1");
Options tryTurnOption;
Enum.TryParse<Options>("insert", false, out tryTurnOption);


二、位標志

我們可能需要多個枚舉的組合來滿足我們的需要。

位運算是針對二進制位進行的運算,常用的位運算主要有與(&), 或(|)和非(~)   

e.m:1 & 0 = 0, 1 | 0 = 1, ~1 = 0

要使枚舉類型具有位運算的能力,需要加上特性[FlagsAttribute]簡寫[Flags]。有些位處於on狀態,有些處於off狀態。所以通常在定義一個None=0的枚舉符號。相對應的值都為2的指數倍。為的是后續的運算。

[Flags]
public enum Options
{
            None=0,
            Insert = 1, //二進制: 0001
            Update = 2, //二進制: 0010
            Save = 4,   //二進制: 0100
            Delete = 8, //二進制: 1000
            Query = 16  //二進制:10000
}

權限列表:

Options hasOps = Options.Insert | Options.Update;
string ops = hasOps.ToString();

我們看到, Options.Insert | Options.Update=0001|0010,“|”與操作:1 | 0 = 1,是二進制位的運算。我們可以得到結果為:0011。對於這個結果怎么去應用。

權限判斷:

if ((hasOps & Options.Insert) == Options.Insert)
{
                Console.WriteLine("Has {0}", Options.Insert);
}

我們可以根據“&”與操作進行權限判斷,可以表示為:0011&0001=0001,后面0001==0001,符合條件,有Insert權限。

實例:項目中,有時會進行正則匹配。

string[] imgsArr = Regex.Split(imgsArea, ",", RegexOptions.IgnoreCase | RegexOptions.Multiline);   這句話主要看后面:RegexOptions.IgnoreCase | RegexOptions.Multiline,可以表示為:0001|0010=0011,意思也就是需要同時符合兩個條件,

:RegexOptions.IgnoreCase不區分大小寫匹配 和 RegexOptions.Multiline 多行模式匹配

[Flags]
public
enum RegexOptions { None = 0, IgnoreCase = 1, Multiline = 2, ExplicitCapture = 4, Compiled = 8, Singleline = 16, IgnorePatternWhitespace = 32, RightToLeft = 64, ECMAScript = 256, CultureInvariant = 512, }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM