真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#中枚舉之轉(zhuǎn)換、標志和屬性的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下C#中枚舉之轉(zhuǎn)換、標志和屬性的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昔陽企業(yè)提供專業(yè)的網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè),昔陽網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

枚舉是 C# 中最有意思的一部分,大部分開發(fā)人員只了解其中的一小部分,甚至網(wǎng)上絕大多數(shù)的教程也只講解了枚舉的一部分。那么,我將通過這篇文章向大家具體講解一下枚舉的知識。我將從大家都了解的部分開始講解,然后再講解大家所不知道的或者了解很少的部分。

零、基礎(chǔ)知識

枚舉是由開發(fā)人員聲明的一種 值類型 ,它在編譯時就聲明了一種 具名常量值 。使用枚舉可以使我們的代碼簡單易讀,我們先來看一下兩個代碼段:

// 代碼段 1 
void Method(int country) 
{ 
 switch (country) 
 { 
  case 0: 
   // more code 
   break; 
  case 1: 
   // more code 
   break; 
  case 2: 
   // more code 
   break; 
  case 3: 
   // more code 
   break; 
  default: 
   // more code 
   break; 
 } 
} 
 
// 代碼段 2 
void Method(Country country) 
{ 
 switch (country) 
 { 
  case Country.CN: 
   // more code 
   break; 
  case Country.JP: 
   // more code 
   break; 
  case Country.UK: 
   // more code 
   break; 
  case Country.USA: 
   // more code 
   break; 
  default: 
   // more code 
   break; 
 } 
}

從上面的兩個代碼段我們可以看到兩者有明顯的區(qū)別。第一段代碼中的 case 值我們幾乎完全不知道代表了什么是什么意思,但是第二段代碼我們使用了枚舉,通過 case 值馬上就可以知道所要表達的意思。同樣利用枚舉值替代布爾值也可以改善代碼的可讀性,例如我們要開發(fā)控制臺燈打開關(guān)閉的程序,代碼可以這么寫 LightOperating(True) ,但是這種代碼我們無法看出具體要干什么,現(xiàn)在我們將代碼改動一下 LightOperating(Light.On) 。經(jīng)過修改代碼就很容易看出所要表達的意思。

1.枚舉定義與取值 定義枚舉有兩種方式,分別是普通方式和自定義方式。不管使用哪種方式都需要用的關(guān)鍵字 enum 來標識這個類型為枚舉類型,并且枚舉值都是作為整數(shù)常量來實現(xiàn)的。下面我們就來看一下這兩種方式怎么定義枚舉的。普通方式是我們經(jīng)常用到的,也是默認的方式。這種方式很簡單,代碼如下:

enum Country 
{ 
 CN, 
 UK, 
 JP, 
 USA 
}

在上面的代碼段中我們定義了一個國家枚舉,第一個枚舉值對應(yīng)的整數(shù)常量是 0 ,第二個枚舉值對應(yīng)的整數(shù)常量是 1 ,以此類推后面的枚舉值分別對應(yīng)的整數(shù)常量是 2 和 3 。但是在部分情況下我們需要自定義枚舉值對應(yīng)的整數(shù)常量,這個時候我們就需要用到自定義的方式。自定義方式又稱為為枚舉值顯式賦值,它的方法如下所示:

enum Country 
 { 
  CN = 3, 
  UK, 
  JP = 70, 
  USA = 67 
 }

我們在代碼中將第一個枚舉值對應(yīng)的整數(shù)常量設(shè)置為了 3 ,這時第二個枚舉值的整數(shù)常量就不是 1 了,而是 4 ,因為當枚舉值沒有顯示賦值時,將會按照上一個枚舉值對應(yīng)的整數(shù)值加 1 來作為自己本身對應(yīng)的整數(shù)值。最后兩個枚舉值因為顯式賦值了因此對應(yīng)的整數(shù)值就是所賦值的數(shù)值。 枚舉取值也很簡單,只需要 枚舉名.枚舉值 即可,例如 Country.UK 。

Tip:這里我提幾點建議:

  • 枚舉值的名稱不應(yīng)包含枚舉名稱;

  • 枚舉名稱應(yīng)以單數(shù)的形式出現(xiàn)(除了屬性)。

2.枚舉的類型 到目前為止我們定義枚舉類型使用的基礎(chǔ)類型 int 類型,但是枚舉不僅僅可以使用 int 類型,還可以使用除了 char 類型之外的所有基礎(chǔ)類型。我們可以使用繼承語法來指定其他類型。

enum Country:short 
 { 
  CN = 3, 
  UK, 
  JP = 70, 
  USA = 67 
 }

上面代碼中我們顯式定義了枚舉所使用的基礎(chǔ)類型為 short 。這里雖然使用了繼承語法但是并沒有建立繼承關(guān)系,所有的枚舉基類都是 System.Enum ,這些類都是密封類,無法從現(xiàn)有的枚舉類型派生出新的成員。 對于枚舉類型的變量,值不限于聲明中命名的值,因此值能轉(zhuǎn)換成基礎(chǔ)類型,那么就能轉(zhuǎn)換為枚舉類型。之所以這么設(shè)計是因在以后的 API 中有很大的可能在不破換老版本的同時為枚舉添加新的值。但是這其中也存在一個缺陷,枚舉允許在運行時分配未知的值,對于這一點我們在開發(fā)時需要考慮到。并且在后期向枚舉中添加新的枚舉值時應(yīng)將其添加到所有枚舉值的后面,或者顯示指定枚舉值對應(yīng)的數(shù)值,這樣才能避免因添加新值導致枚舉類型中的枚舉值對應(yīng)的數(shù)值改變。

Tip:在開發(fā)中我們應(yīng)該盡量使用 int 作為枚舉的基礎(chǔ)類型,除非因性能問題或互操作方面的考慮時才會考慮使用較小的類型。

一、枚舉轉(zhuǎn)換

枚舉轉(zhuǎn)換主要涉及到了枚舉與枚舉的轉(zhuǎn)換、枚舉與數(shù)字和字符串的轉(zhuǎn)換。

1.枚舉之間轉(zhuǎn)換 首先我要說明的是在 C# 中不支持不同枚舉數(shù)組之間的直接轉(zhuǎn)換,所以如果想要實現(xiàn)不同枚舉數(shù)組之間的轉(zhuǎn)換我們可以利用 CLR 寬松的賦值兼容性這一特點來進行轉(zhuǎn)換,需要轉(zhuǎn)換的兩個枚舉必須具有相同的基礎(chǔ)類型。同樣,我們通過一個例子來看一下具體實現(xiàn)方法。

static void Main(string[] args) 
 { 
  CountryAllName[] can = (CountryAllName[])(Array)new Country[4]; 
 } 
enum Country 
 { 
  CN, 
  UK, 
  JP, 
  USA 
 } 
 enum CountryAllName 
 { 
  China, 
  UnitedKingdom, 
  Japan, 
  UnitedStates 
 }

在使用這種方法時有可能會出現(xiàn)意外的錯誤或結(jié)果,并且相關(guān)開發(fā)規(guī)范中并沒有說這種方式每次都起作用,因此我不建議這么使用,除非在一些極端場景中。

2.枚舉和字符串之間轉(zhuǎn)換 枚舉轉(zhuǎn)換為字符串可以直接使用 ToString() 方法, 枚舉值 ToString 后會直接輸出枚舉值標識符的字符串形式,例如 Country.CN.ToString() 得到的結(jié)果是字符串 CN 。當然,你也可以利用 Enum.GetNames 和 Enum.GetName 方法來獲取。下面我簡單來講解一下這兩個方法的使用。

  • GetNames GetNames 方法需要傳入一個枚舉類型,返回值是一個字符串數(shù)組。例如需要獲取到 Country 的第二個國家,那么就可以這么來寫 Enum.GetNames(typeof(Country))[1] ,返回結(jié)果是 UK 。

  • GetName GetName 方法返回的是一個字符串,這個字符串就是需要獲取的指定枚舉值的字符串形式。同樣我們獲取第二個國家, Enum.GetName(typeof(Country),1) ,返回的值同樣是 UK 。 字符串轉(zhuǎn)換為枚舉也很簡單,同樣用到了 Enum 基類的一個靜態(tài)方法 Parse ,例如我們將 JP 轉(zhuǎn)換為枚舉 Country 的枚舉值可以這么做 (Country)Enum.Parse(typeof(Country),"JP") 。這里有一點需要注意, TryParse 方法是在 .net 4.0 才出現(xiàn)的,因此如果要在 .net 4.0 以下版本中將字符串轉(zhuǎn)換為枚舉時,需要進行恰當?shù)腻e誤處理防止字符串不存在與枚舉類型中的枚舉值中。

Tip:字符串向枚舉轉(zhuǎn)換不可本地化,如果必須本地化,就必須是那些對上層用戶不可見的消息。因此在實際開發(fā)中應(yīng)該盡量避免枚舉和字符串之間的轉(zhuǎn)換。

3.枚舉和數(shù)字之間轉(zhuǎn)換 枚舉轉(zhuǎn)換為數(shù)字我們可以使用強轉(zhuǎn),例如 (int)Country.CN 返回結(jié)果是 0 。從數(shù)字轉(zhuǎn)換為枚舉我們有兩種方法,一種是使用強轉(zhuǎn),另一種是使用 Enum 的靜態(tài)方發(fā) ToObject 。

  • 強轉(zhuǎn) 強轉(zhuǎn)就比較簡單了, Country country = (Country)2

  • ToObject ToObject 方法需要傳入枚舉類型和需要轉(zhuǎn)換的數(shù)字,例如 Country country = (Country)Enum.ToObject(typeof(Country),2)

4.注意 字符串轉(zhuǎn)換為枚舉和數(shù)字轉(zhuǎn)換為枚舉都必須先進行判斷所要轉(zhuǎn)換的值是否包含在枚舉中,判斷的方法也很簡單只需要調(diào)用 Enum 的靜態(tài)方法 IsDefined 即可,例如我要將 0 和 HK 轉(zhuǎn)換為枚舉,代碼如下:

Type type = typeof(Country); 
 if(Enum.IsDefined(type,0)) 
 { 
  Enum.ToObject(type, 0); 
 } 
 if(Enum.IsDefined(type,"HK")) 
 { 
  Enum.Parse(typeof(Country), "HK"); 
 }

上述代碼中只有 0 會成功轉(zhuǎn)換為枚舉值 CN ,因為 0 所對應(yīng)的枚舉值是 CN ,而 HK 并沒有在枚舉中。

三、標志與屬性

這一小節(jié)我們來講解一下標志與屬性,標志he和屬性屬于在開發(fā)中用的比較少,并且大部分程序員了解的也不多。

1.標志 在開發(fā)中有時我們希望能對枚舉進行組合使用來表示復(fù)合值,那么這時我們就需要定義標志枚舉了,標志枚舉的名稱為復(fù)數(shù)形式,代表了一個標志的集合。一般我們會使用按位或操作符鏈接枚舉值,使用 HasFlags 方法或者按位與操作符來判斷特定的位是否存在。比較經(jīng)典的標志枚舉是位于 System.IO 命名空間中的 FileAttributes 標志枚舉,它列出了文件的所有屬性,比如只讀、隱藏、所在磁盤等等,它所包含的所有枚舉值皆可相互組合,例如一個文件既是隱藏文件又是只讀文件。定義標志枚舉的方法如下:

[Flags] 
enum WeekDays 
 { 
  Monday = 1, 
  Tuesday = 2, 
  Wednesday = 4, 
  Thursday = 8, 
  Friday = 16, 
  Saturday = 32, 
  Sunday = 64 
 }

在上面的代碼中你會發(fā)現(xiàn)一個規(guī)律,每個枚舉值對應(yīng)的整數(shù)值都是 2的n次方,這是為什么呢。在標志枚舉中要求多個枚舉值相互組合后的結(jié)果不能包含在標志枚舉中,并且基于按位運算的特性可以很方便的使用位運算符來計算一個枚舉值是否包含了另外一個枚舉值,這在權(quán)限系統(tǒng)中相當有用。

2.屬性 枚舉值上同樣也可以使用屬性,例如我們需要打印輸出枚舉值的中文名,我們就可以通過屬性的形式進行設(shè)置,首先我們需要定義一個屬性:

public class EnumChineseAttribute : Attribute 
 { 
  private string m_strDescription; 
  public EnumChineseAttribute(string chineseName) 
  { 
   m_strDescription = chineseName; 
  } 
 
  public string Description 
  { 
   get { return m_strDescription; } 
  } 
 } 
 enum Country 
 { 
  [EnumChinese("中國")] 
  CN, 
  [EnumChinese("英國")] 
  UK, 
  [EnumChinese("日本")] 
  JP, 
  [EnumChinese("美國")] 
  USA 
 } 
 static void Main(string[] args) 
 { 
  Country country = Country.CN; 
  FieldInfo fieldInfo = country.GetType().GetField("CN"); 
  object[] attribArray = fieldInfo.GetCustomAttributes(false); 
  EnumChineseAttribute attrib = (EnumChineseAttribute)attribArray[0]; 
  Console.WriteLine(attrib.Description); 
  Console.Read(); 
 }

通過上面的代碼我們就能獲取到 CN 對應(yīng)的中文名稱了,這段代碼并沒有進行進一步優(yōu)化,在實際項目中必須進行封裝和優(yōu)化。

以上是“C#中枚舉之轉(zhuǎn)換、標志和屬性的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


網(wǎng)頁標題:C#中枚舉之轉(zhuǎn)換、標志和屬性的示例分析-創(chuàng)新互聯(lián)
文章起源:http://weahome.cn/article/dccseg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部