小編這次要給大家分享的是詳解c# 枚舉,文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
碧江網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),碧江網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為碧江近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的碧江做網(wǎng)站的公司定做!
一、在學(xué)習(xí)枚舉之前,首先來(lái)聽聽枚舉的優(yōu)點(diǎn)。
1、枚舉能夠使代碼更加清晰,它允許使用描述性的名稱表示整數(shù)值。
2、枚舉使代碼更易于維護(hù),有助于確保給變量指定合法的、期望的值。
3、枚舉使代碼更易輸入。
二、枚舉說明
1、簡(jiǎn)單枚舉
(1)枚舉使用enum關(guān)鍵字來(lái)聲明,與類同級(jí)。枚舉本身可以有修飾符,但枚舉的成員始終是公共的,不能有訪問修飾符。枚舉本身的修飾符僅能使用public和internal。
(2)枚舉是值類型,隱式繼承自System.Enum,不能手動(dòng)修改。System.Enum本身是引用類型,繼承自System.ValueType。
(3)枚舉都是隱式密封的,不允許作為基類派生子類。
(4)枚舉類型的枚舉成員均為靜態(tài),且默認(rèn)為Int32類型。
(5)每個(gè)枚舉成員均具有相關(guān)聯(lián)的常數(shù)值。此值的類型就是枚舉的底層數(shù)據(jù)類型。每個(gè)枚舉成員的常數(shù)值必須在該枚舉的底層數(shù)據(jù)類型的范圍之內(nèi)。如果沒有明確指定底層數(shù)據(jù)類型則默認(rèn)的數(shù)據(jù)類型是int類型。
(6)枚舉成員不能相同,但枚舉的值可以相同。
(7)枚舉最后一個(gè)成員的逗號(hào)和大括號(hào)后面的分號(hào)可以省略
C#提供類一個(gè)類來(lái)方便操作枚舉,下面給出這個(gè)類的常用方法:
方法 | 名稱 |
CompareTo | 將此實(shí)例與指定對(duì)象進(jìn)行比較并返回一個(gè)對(duì)二者的相對(duì)值的指示 |
Equals | 指示此實(shí)例是否等于指定的對(duì)象 |
Format | 根據(jù)指定格式將指定枚舉類型的指定值轉(zhuǎn)換為其等效的字符串表示形式 |
GetName | 在指定枚舉中檢索具有指定值的常數(shù)的名稱 |
GetNames | 檢索指定枚舉中常數(shù)名稱的數(shù)組 |
GetTypeCode | 返回此實(shí)例的基礎(chǔ) TypeCode |
GetUnderlyingType | 返回指定枚舉的基礎(chǔ)類型 |
GetValues | 索指定枚舉中常數(shù)值的數(shù)組 |
HasFlag | 確定當(dāng)前實(shí)例中是否設(shè)置了一個(gè)或多個(gè)位域 |
IsDefined | 返回指定枚舉中是否存在具有指定值的常數(shù)的指示 |
Parse | 將一個(gè)或多個(gè)枚舉常數(shù)的名稱或數(shù)字值的字符串表示轉(zhuǎn)換成等效的枚舉對(duì)象。 一個(gè)參數(shù)指定該操作是否不區(qū)分大小寫 |
TryParse | 將一個(gè)或多個(gè)枚舉常數(shù)的名稱或數(shù)字值的字符串表示轉(zhuǎn)換成等效的枚舉對(duì)象。 用于指示轉(zhuǎn)換是否成功的返回值 |
要顯示指定枚舉的底層數(shù)據(jù)類型很簡(jiǎn)單,只需在聲明枚舉的時(shí)候加個(gè)冒號(hào),后面緊跟要指定的數(shù)據(jù)類型。
enum sex : byte //顯示指定枚舉的底層數(shù)據(jù)類型 { male, female, //此逗號(hào)可以省略 }; //此分號(hào)可以省略
顯式設(shè)置枚舉的成員常量值,默認(rèn)是從0開始,逐個(gè)遞增的。但是以下例子卻設(shè)置成了1,2,3,4,5,6,7,0。而且成員值可以一樣的。
enum Week { Monday = 1, Tuesday = 2, Wednesday = 3, Sunday = 0, Everyday = 1 //成員的值可以設(shè)置成一樣的,但是成員不行 } Console.WriteLine((int)Week.Monday); //獲取值
示例,由枚舉值獲取枚舉名稱與由枚舉名稱獲取枚舉值
class Program { static void Main(string[] args) { Console.WriteLine(Enum.GetName(typeof(Man),1)); //還是 劉備 (由值獲取名字) string[] array1 = Enum.GetNames(typeof(Man)); Console.WriteLine(array1[1]); //關(guān)羽 Array array2 = Enum.GetValues(typeof(Man)); Console.WriteLine(array2.GetValue(1)); //還是關(guān)羽 Type t = Enum.GetUnderlyingType(typeof(Man)); Console.WriteLine(t); //輸出 Int32 //由值獲取內(nèi)容 int i = 1; string Name = Enum.Parse(typeof(Man), i.ToString()).ToString(); //此時(shí) Name="劉備" Console.WriteLine(Name); //由值獲取內(nèi)容 string Name2 = "關(guān)羽"; int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2)); //此時(shí) j=2 Console.WriteLine(j); Console.ReadKey(); } } enum Man { 劉備 = 1, 關(guān)羽 = 2, 張飛 = 3 }
2、標(biāo)志枚舉
標(biāo)志枚舉要在頂部加[System.Flags]特性進(jìn)行聲明。而且枚舉支持組合運(yùn)算。先來(lái)看個(gè)例子
class Program { static void Main(string[] args) { var man = Week.白 | Week.美; //賦值為101 計(jì)算方法001或上100,結(jié)果是101 Console.WriteLine((int)man); if ((man & Week.白) == Week.白) //101 man { //001 白 逐位相與, Console.WriteLine("此人白"); //001 如果結(jié)果是白,就可以反推出man包含 白 } else { Console.WriteLine("此人黑"); } Console.ReadKey(); } } [System.Flags] public enum Week { 白 = 1, //001 富 = 2, //010 美 = 4, //100 }
這種位運(yùn)算是非常有用的,在sql語(yǔ)句里也支持位運(yùn)算。也就是說,把一個(gè)枚舉運(yùn)算后的結(jié)果存入數(shù)據(jù)庫(kù)之后,還能夠按照你的要求讀取出來(lái)。比如:
將一個(gè)"白美"存如數(shù)據(jù)庫(kù)的值存入數(shù)據(jù)庫(kù),那么存入去的就是整型5。
那么我想讀出所有的"白"數(shù)據(jù)列表怎么讀呢?白,可以是純白"1",也是是白富3,可以是白美5,也可以是白富美7,你可以用in來(lái)讀,但是更好的方法是在sql語(yǔ)句中同樣使用位運(yùn)算。
select * from Table1 where Tag & 1 = 1 //Tag是列名 select * from Table1 where Tag | 1 = Tag
三、枚舉的使用建議
當(dāng)參數(shù)、返回值、變量等類型可以使枚舉,盡量使用枚舉(要注意考慮分類的穩(wěn)定性)
大多數(shù)情況下都可以使用int類型枚舉,下列情況除外。
枚舉可能被大量頻繁的使用,這時(shí)為了節(jié)約空間可以使用小于int類型的枚舉。
標(biāo)志枚舉,且標(biāo)志多于32個(gè)。
下面寫一個(gè):枚舉綁定MVC3下拉列表的示例:
控制器代碼:
namespace MvcStart.Controllers { public class HomeController : Controller { public ActionResult GetSexList() { DictionarySexlist = new Dictionary (); string[] keys = Enum.GetNames(typeof(sex)); Array values = Enum.GetValues(typeof(sex)); for (int i = 0; i < keys.Length; i++) { Sexlist.Add(keys[i], (int)values.GetValue(i)); } return View(Sexlist); } } public enum sex { male = 1, female = 2, other = 3 } }
視圖代碼:
@model Dictionary
生成的HTML代碼:
再來(lái)一個(gè)例子,獲取枚舉描述
public static class GetDescription { ////// 獲取描述信息 /// /// ///public static string description(this Enum en) { Type type = en.GetType(); MemberInfo[] memInfo = type.GetMember(en.ToString()); if (memInfo != null && memInfo.Length > 0) { object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false); if (attrs != null && attrs.Length > 0) return ((DescriptionAttribute)attrs[0]).Description; } return en.ToString(); } } public enum Sex { [Description("男")] man = 1, [Description("女")] woman = 2, [Description("其他")] other = 3 }
看完這篇關(guān)于詳解c# 枚舉的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。