枚舉值為何為1、2、4、8、16....-創(chuàng)新互聯(lián)

枚舉值為什么使用1,2,4,8,16,32等2的冪方(轉(zhuǎn)) 使用1,2,4,8,16,32等2的冪方,防止重復(fù)。
.NET中的枚舉我們一般有兩種用法,一是表示唯一的元素序列,例如一周里的各天;還有就是用來表示多種復(fù)合的狀態(tài)。這個(gè)時(shí)候一般需要為枚舉加上[Flags]特性標(biāo)記為位域,例如:
[Flags]
enum Styles{
ShowBorder = 1,         //是否顯示邊框
ShowCaption = 2,        //是否顯示標(biāo)題
ShowToolbox = 4         //是否顯示工具箱
}
  這樣我們就可以用"或"運(yùn)算符組合多個(gè)狀態(tài),例如
myControl.Style = Styles.ShowBorder | Styles.ShowCaption;
  這時(shí)myControl.Style枚舉的值將變成 1+2=3,它的ToString()將變成"Styles.ShowBorder , Styles.ShowCaption"
  這里我們可以解釋為什么第三個(gè)值ShowToolbox可以為4,5..而不能為3。也就是說它的值不應(yīng)該是前幾項(xiàng)值的復(fù)合值。有一個(gè)比較簡(jiǎn)單的方法就是用2的n次方來依次為每一項(xiàng)賦值,例如 1,2,4,8,16,32,64.....
  現(xiàn)在舉個(gè)常見的Flags應(yīng)用例子。例如一個(gè)簡(jiǎn)單的權(quán)限系統(tǒng),有"Admin"和"User"兩種角色,我們可以在表中放一個(gè)varchar()字段,以文本形式存放權(quán)限字"Admin,User"。但是用Flags型枚舉的話,我們就可以直接將 Roles.Admin | Roles.User 的值放在一個(gè)int字段里。
  以下是關(guān)于枚舉的一些常見操作:
  將枚舉的值變回枚舉對(duì)象:
  Styles style = (Styles) Enum.Parse(typeof(Styles), 4 );   // -> style = Styles.Toolbox;
  檢查枚舉是否包含某個(gè)元素:
  bool hasFlag = ((style & Styles.ShowBorder) != 0);
  其實(shí)我們還會(huì)碰到一種情況,就是需要從組合狀態(tài)中去掉一個(gè)元素。用"^"運(yùn)算符可以做到:
  Styles style = Styles.ShowBorder | Styles.ShowCaption;
  style = style ^ Styles.ShowBorder;
  這個(gè)時(shí)候style的值就會(huì)變成 Styles.ShowCaption
  但這里有一個(gè)很嚴(yán)重的問題(偶現(xiàn)在才發(fā)現(xiàn))
  我們這個(gè)時(shí)候再執(zhí)行一次
  style = style ^ Styles.ShowBorder;
  按照我們的設(shè)想,這個(gè)時(shí)候 style 的值是 Styles.ShowCaption,不包含 Styles.ShowBorder,所以我們就算去掉這個(gè)元素,style應(yīng)該還是不會(huì)變。但實(shí)際的 style 的值卻又變成了 Styles.ShowBorder | Styles.ShowCaption !! 再執(zhí)行一遍,又會(huì)去掉這個(gè)元素,周而復(fù)始。
  當(dāng)然我們可以在去掉某個(gè)元素前做一番檢查,如果枚舉包含這個(gè)元素,再去掉它:
if ((style & Styles.ShowBorder) != 0){
   style = style ^ Styles.ShowBorder;
}
  不知道有沒有其它方法可以方便地從Flags枚舉狀態(tài)中去掉一個(gè)元素。。
  Thanks to mobilebilly:
  style = style & (~Styles.ShowBorder) 可以方便去掉一個(gè)元素。
 (2)枚舉成員
       枚舉成員是該枚舉類型的命名常數(shù)。每個(gè)枚舉成員名稱唯一且均具有相關(guān)聯(lián)的常數(shù)值,此值的類型就是枚舉的基礎(chǔ)類型。每個(gè)枚舉成員的常數(shù)值必須在該枚舉的基礎(chǔ)類型的范圍之內(nèi)。
   示例:
        public enum TimeofDay:uint
       {
           Morning=-3,
           Afternoon=-2,
           Evening=-1
        }
   產(chǎn)生編譯時(shí)錯(cuò)誤,原因是常數(shù)值 -1、-2 和 –3 不在基礎(chǔ)整型 uint 的范圍內(nèi)。
   注意:為所有的每句成員加上注釋是很必要的,否則別人看到你的成員里面那么多不認(rèn)識(shí)的單詞甚至縮寫有多么痛苦……
(3)枚舉成員賦值
       規(guī)則:允許多個(gè)枚舉成員有相同的值,允許無(wú)順序地定義成員值,沒有顯式賦值的成員的值默認(rèn)為上一個(gè)成員的值+1(第一個(gè)成員如果沒賦值的話默認(rèn)就是0)。另外,枚舉值都不能超過它的基礎(chǔ)類型范圍。
     示例
        public enum Color
       {
           red = 1,
           green,
           orange = 1,
           grey = 5,
           purple
       }
       上面green的值為2,而purple的值則為6。 red和orange同為1。
   注意:正是由于默認(rèn)+1這樣的規(guī)則,建議每個(gè)成員都手動(dòng)賦值,以免出現(xiàn)程序?qū)懙揭话耄瑥那懊娓膭?dòng)或者增加成員的時(shí)候,后面的成員默認(rèn)值都會(huì)改變,這就麻煩了。
(4)枚舉類型與基礎(chǔ)類型的轉(zhuǎn)換
    基礎(chǔ)類型不能隱式轉(zhuǎn)換為枚舉類型
    枚舉類型也不能隱式轉(zhuǎn)換為基礎(chǔ)類型
   示例:
    public enum Number
   {
       a,
       b
   }
    class Test
   {
        public static void Main()
       {
            int i = Number.a;//錯(cuò)誤,要強(qiáng)制類型轉(zhuǎn)換(int)Number.a
            Number n;
           n = 2//又錯(cuò)誤,要強(qiáng)制類型轉(zhuǎn)換(Number)2
       }
   }
(5)枚舉類型的使用
switch(timeofDay) //switch中的使用
{
   case TimeofDay.Morning:
        Console.WriteLine("good morning");
        break;
       //……其他的省略啦
}
int hashCode = timeofDay.Morning.GetHashCode();//得到枚舉成員的值
string str = timeofDay.Morning.toString();//得到枚舉成員的名字
string enumParseStr = Enum.Parse(typeof(timeofDay) , hashCode.ToString()).toString();//將枚舉的值轉(zhuǎn)換成對(duì)應(yīng)的名字
int enumParseInt = Convert.ToInt32(Enum.Parse(typeof(timeofTime), str));//將枚舉的名字轉(zhuǎn)換成對(duì)應(yīng)的值枚舉值為何為1、2、4、8、16
....

文章標(biāo)題:枚舉值為何為1、2、4、8、16....-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article0/dpecoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、服務(wù)器托管、移動(dòng)網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)搜索引擎優(yōu)化、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)