“多态枚举”数值如何判断?
枚舉的作用就是用“字面量”的形式(附帶智能提示)取代純粹的數字化。假設某一個程序中有4盞燈,同時該程序帶有一個輸入源信號來輸入究竟是那個燈點亮——顯然定義一個枚舉遠遠勝過用數字(1,2,3,4)表示具體某個燈亮好得多。因此枚舉和數值往往是密不可分的。通常情況下枚舉第一項默認是0,以后每項遞增1;但是某些情況下(例如“多態枚舉”——指一個枚舉值可能包含多種枚舉狀態)的情況下,你完全為某些枚舉指定對應的值,而且必須如此(理由后面說明)。譬如判斷任意一個文件在Windows下的狀態(假設3種):
[C#]
public enum FileAttributes {Normal = 1 Hidden = 1<<1 ReadOnly = 1<<2 }[VB.NET]
Public Enum FileAttributesNormal = 1 Hidden = 1<<1 [ReadOnly] = 1 << 2 End Enum之所以要為每個枚舉單獨指定對應的數值,其原因在于一個文件不可能單獨是“一種狀態”(比如一個文本文件可能具備“隱藏”和“只讀”雙態),顯然單獨用一個枚舉值根本無法表示,而且要把每種狀態的組合列出也根本不可能;不過大家應該清楚一點——那就是枚舉和數值之間的轉換關系:
1)當把一個數字轉換成枚舉,且這個數字映射到某個特定的枚舉值,則直接輸出該枚舉值。
2)當把一個數字轉換成枚舉,且這個數字無法映射到某個特定的枚舉值,則直接輸出該數字。
因此.net中允許枚舉進行“與或非”的操作——其中“或”操作等同于“+”(這個枚舉不支持),把不同的枚舉映射的數值求和,那么所得到的結果自然也就是包含多個枚舉值的結果。
這樣求和有什么先決條件么?顯然是有的。因為“或”運算是“全1得0,見1得1”(“全1”表示兩個比特位都是1,那么得到0,例如二進制:1+1=0)。這樣的話,如果枚舉值是按照默認的“遞增”的話,顯然會造成數據上的混亂(譬如一開始0,第二項1,那么“或”變成1,以后你再也推斷不出那個“0”對應的枚舉值曾經用過;再譬如從2開始,第二項3,那么“或”的結果是5,“5”的二進制為“0000 0101",這樣的話“2”和“3”其實也就無法得到了(因為“或”的緣故亂套了)。
要使的其“不亂套”,唯一的方法就是每個枚舉值取“2”的N次方(理由很簡單:因為2的N次方只有特定位為1,其余均為0,這樣“或”不會導致“1變成0”的慘劇)。例如示例代碼中每個枚舉值都是前一次“左移一位”(本質是2的N次方!),這樣“或”的結果是0000 0001+0000 0010=0000 0011(十進制3)。
對于我們而言,要判斷某個“多態枚舉”是否包含特有值,只需把這個值與“特定值”進行“與”操作(因為“與”是“見0得0,全1得1”,可以屏蔽其它位而保留特定位)。之前說過“2的N次方”只有特定位是1,那么“或”之后對其“與”,則只需判斷特定位是否為1即可了。代碼如下(假設FileAttributes是一個已經定義并且賦值的枚舉變量)。
[C#]
if(FileAttributes & FileAttributes.Hidden == File.Attributes.Hidden) {……………… }[VB.NET]
If (FileAttributes And FileAttributes.Hidden = FileAttributes.Hidden) Then………………End If
?同樣地,Enum中有一個Parse(或者TryParse)方法允許我們把枚舉名稱(或者枚舉名稱對應的數值)轉化成相應的枚舉類型。這里如果輸出多個枚舉,自動做“或”運算:
下面可以做一個實驗:
[C#]
enum Colors { None = 0, Red = 1, Green = 2, Blue = 3 };string[] colorStrings = { "Red,Green" };foreach (string colorString in colorStrings){Colors colorValue;if (Enum.TryParse(colorString, out colorValue)) Console.WriteLine(colorValue);}
[VB.NET]
Enum ColorsNone = 0
Red = 1
Green = 2
Blue = 3
End Enum
Dim colorStrings As String() = {"Red,Green"} For Each colorString As String In colorStringsDim colorValue As ColorsIf [Enum].TryParse(colorString, colorValue) ThenConsole.WriteLine(colorValue)End If Next
如果直接輸出“colorValue”,那么結果是“3”,恰恰是Red+Green的枚舉值。(是“或”關系)。
記住:“枚舉”和“數值”是一一對應的,否則就會出現“張冠李戴”的錯誤,啼笑皆非:
[C#]
public class Example {enum Colors { None = 0, Red = 1, Green = 2, Blue = 3 };public static void Main(){string[] colorStrings = { "Red,Green" };foreach (string colorString in colorStrings){Colors colorValue;if (Enum.TryParse(colorString, out colorValue)) Console.WriteLine(colorValue);}} }[VB.NET]
Public Class ExamplePrivate Enum ColorsNone = 0Red = 1Green = 2Blue = 3End EnumPublic Shared Sub Main()Dim colorStrings As String() = {"Red,Green"}For Each colorString As String In colorStringsDim colorValue As ColorsIf [Enum].TryParse(colorString, colorValue) ThenConsole.WriteLine(colorValue)End IfNextEnd Sub End Class"Red"+"Green"=3,因此最終輸出的是Blue,因為Blue=3。
轉載于:https://www.cnblogs.com/ServiceboyNew/archive/2012/07/17/2595229.html
總結
以上是生活随笔為你收集整理的“多态枚举”数值如何判断?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android version and
- 下一篇: Phpcms之核心目录phpcms