C#編程中枚舉類型的使用教程
枚舉類型(也稱為枚舉)為定義一組可以賦給變量的命名整數(shù)常量提供了一種有效的方法。例如,假設(shè)您必須定義一個(gè)變量,該變量的值表示一周中的一天。該變量只能存儲(chǔ)七個(gè)有意義的值。若要定義這些值,可以使用枚舉類型。枚舉類型是使用 enum關(guān)鍵字聲明的。
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
默認(rèn)情況下,枚舉中每個(gè)元素的基礎(chǔ)類型是 int??梢允褂妹疤?hào)指定另一種整數(shù)值類型,如前面的示例所示。可以通過(guò)轉(zhuǎn)換驗(yàn)證基礎(chǔ)數(shù)值與基礎(chǔ)類型,如下例所示。
Days today = Days.Monday; int dayNumber =(int)today; Console.WriteLine("{0} is day number #{1}.", today, dayNumber); Months thisMonth = Months.Dec; byte monthNumber = (byte)thisMonth; Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);
輸出:
Monday is day number #1. Dec is month number #11.
以下是使用枚舉而不使用數(shù)值類型的好處:
明確為客戶端代碼指定哪些值是變量的有效值。
在 Visual Studio 中,IntelliSense 列出定義的值。
如果未在枚舉數(shù)列表中指定元素的值,則值將自動(dòng)按 1 遞增。在前面的示例中,Days.Sunday 的值為 0,Days.Monday 的值為 1,依此類推。創(chuàng)建新的 Days 對(duì)象時(shí),如果不顯式為其賦值,則它將具有默認(rèn)值 Days.Sunday (0)。創(chuàng)建枚舉時(shí),應(yīng)選擇最合理的默認(rèn)值并賦給它一個(gè)零值。這便使得只要在創(chuàng)建枚舉時(shí)未為其顯式賦值,則所創(chuàng)建的全部枚舉都將具有該默認(rèn)值。
如果變量 meetingDay 的類型為 Days,則只能將 Days 定義的某個(gè)值賦給它(無(wú)需顯式強(qiáng)制轉(zhuǎn)換)。如果會(huì)議日期更改,可以將 Days 中的新值賦給 meetingDay:
Days meetingDay = Days.Monday; //... meetingDay = Days.Friday;
注意:可以將任意整數(shù)值賦給 meetingDay。例如,代碼行 meetingDay = (Days) 42 不會(huì)產(chǎn)生錯(cuò)誤。但也不應(yīng)該這樣做,因?yàn)槟J(rèn)約定的是枚舉變量只容納枚舉定義的值之一。將任意值賦給枚舉類型的變量很有可能會(huì)導(dǎo)致錯(cuò)誤。
可以將任意值賦給枚舉類型的枚舉數(shù)列表中的元素,也可以使用計(jì)算值:
enum MachineState { PowerOff = 0, Running = 5, Sleeping = 10, Hibernating = Sleeping + 5 }
枚舉類型作為位標(biāo)志
可以使用枚舉類型定義位標(biāo)志,從而使該枚舉類型的實(shí)例可以存儲(chǔ)枚舉數(shù)列表中定義的值的任意組合。(當(dāng)然,某些組合在您的程序代碼中可能沒(méi)有意義或不允許使用。)
創(chuàng)建位標(biāo)志枚舉的方法是應(yīng)用 System.FlagsAttribute 特性并適當(dāng)定義一些值,以便可以對(duì)這些值執(zhí)行 AND、OR、NOT 和 XOR 按位運(yùn)算。在位標(biāo)志枚舉中包含一個(gè)值為零(表示“未設(shè)置任何標(biāo)志”)的命名常量。如果零值不表示“未設(shè)置任何標(biāo)志”,則請(qǐng)不要為標(biāo)志指定零值。
在下面的示例中,定義了 Days 枚舉的另一個(gè)版本,命名為 Days2。 Days2 具有 Flags 特性,且它的每個(gè)值都是 2 的若干次冪,指數(shù)依次遞增。這樣,您將能夠創(chuàng)建值為 Days2.Tuesday 和 Days2.Thursday 的 Days2 變量。
[Flags] enum Days2 { None = 0x0, Sunday = 0x1, Monday = 0x2, Tuesday = 0x4, Wednesday = 0x8, Thursday = 0x10, Friday = 0x20, Saturday = 0x40 } class MyClass { Days2 meetingDays = Days2.Tuesday | Days2.Thursday; }
若要在某個(gè)枚舉上設(shè)置標(biāo)志,請(qǐng)使用按位 OR 運(yùn)算符,如下面的示例所示:
// Initialize with two flags using bitwise OR. meetingDays = Days2.Tuesday | Days2.Thursday; // Set an additional flag using bitwise OR. meetingDays = meetingDays | Days2.Friday; Console.WriteLine("Meeting days are {0}", meetingDays); // Output: Meeting days are Tuesday, Thursday, Friday // Remove a flag using bitwise XOR. meetingDays = meetingDays ^ Days2.Tuesday; Console.WriteLine("Meeting days are {0}", meetingDays); // Output: Meeting days are Thursday, Friday
若要確定是否設(shè)置了特定標(biāo)志,請(qǐng)使用按位 AND 運(yùn)算,如下面的示例所示:
// Test value of flags using bitwise AND. bool test = (meetingDays & Days2.Thursday) == Days2.Thursday; Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not"); // Output: Thursday is a meeting day.
。
使用 System.Enum 方法發(fā)現(xiàn)和操作枚舉值
所有枚舉都是 System.Enum 類型的實(shí)例。不能從 System.Enum 派生新類,但可以使用它的方法發(fā)現(xiàn)有關(guān)枚舉實(shí)例中的值的信息以及操作這些值。
string s = Enum.GetName(typeof(Days), 4); Console.WriteLine(s); Console.WriteLine("The values of the Days Enum are:"); foreach (int i in Enum.GetValues(typeof(Days))) Console.WriteLine(i); Console.WriteLine("The names of the Days Enum are:"); foreach (string str in Enum.GetNames(typeof(Days))) Console.WriteLine(str);
相關(guān)文章
C#實(shí)現(xiàn)的二維數(shù)組排序算法示例
這篇文章主要介紹了C#實(shí)現(xiàn)的二維數(shù)組排序算法,涉及C#針對(duì)二維數(shù)組的遍歷、判斷、排序等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12C#實(shí)現(xiàn)多線程的同步方法實(shí)例分析
這篇文章主要介紹了C#實(shí)現(xiàn)多線程的同步方法,實(shí)例分析了C#線程同步的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04C#使用linq計(jì)算執(zhí)行元素在列表中出現(xiàn)次數(shù)的方法
這篇文章主要介紹了C#使用linq計(jì)算執(zhí)行元素在列表中出現(xiàn)次數(shù)的方法,涉及C#使用linq擴(kuò)展進(jìn)行列表查詢的技巧,需要的朋友可以參考下2015-04-04帶著問(wèn)題讀CLR via C#(筆記二)類型基礎(chǔ)
A1: Object類型共包含6個(gè)方法,Equals, GetHashCode, ToString, GetType, MemberwiseClone和Finalize.2013-04-04C#使用自定義的泛型節(jié)點(diǎn)類實(shí)現(xiàn)二叉樹類
這篇文章主要為大家詳細(xì)介紹了C#如何使用自定義的泛型節(jié)點(diǎn)類 Node<T>實(shí)現(xiàn)二叉樹類BinaryTree<T>及其方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03C# web應(yīng)用程序不能訪問(wèn)app_code下類的原因以及解決方法
本文主要介紹了C#web應(yīng)用程序不能訪問(wèn)app_code下類的原因以及解決方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02