日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
有關(guān)C#枚舉的問答集錦:有關(guān)賦值

本文繼續(xù)介紹C#枚舉的常見問題與答案。

成都創(chuàng)新互聯(lián)公司主營洪澤網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),洪澤h5小程序開發(fā)搭建,洪澤網(wǎng)站營銷推廣歡迎洪澤等地區(qū)企業(yè)咨詢

Q:我留意到Code #02中的

.field public static literal Aligment Center = int32(0x00000001)

該語句明顯是整數(shù)賦值,這是否說明C#枚舉類型實質(zhì)上是整數(shù)類型?

A:這說明枚舉類型與整數(shù)類型的確有一定的關(guān)系。事實上,每一個枚舉類型都有與之相對應(yīng)的整數(shù)類型,我們稱該整數(shù)類型為底層類型(underlying type),默認(rèn)的情況下使用,.NET使用System.Int32。當(dāng)然,你可以手動將其指定為其他的整數(shù)類型:

 
 
 
  1. // Code #09
  2. public enum Alignment : byte
  3. {
  4.     Left,
  5.     Center,
  6.     Right
  7. }

注意,能被指定為枚舉的底層類型的只能是如下所列的整數(shù)類型:byte, sbyte, short, ushort, int, uint, long, ulong。

--------------------------------------------------------------------------------

Q:為何我們需要指定枚舉類型的底層類型?

A:你完全可以讓它接受默認(rèn)的底層類型。請留意Code #08,你完全找不到“Center”這個字眼,然而在C#代碼中,它卻是存在的,為什么呢?這是因為代碼在編譯的時候,編譯器把枚舉類型轉(zhuǎn)換為與之對應(yīng)的底層類型的數(shù)值來處理。Code #08的L_0000實際上就是把類型為System.Int32的數(shù)值1推入堆棧,而不是把“Center”推入堆棧。事實上,底層類型說明了如何為枚舉類型分配空間,不同的底層類型所占用的資源不同,大概當(dāng)你在受限系統(tǒng)上進(jìn)行開發(fā)的話,你就可能需要注意一下了。

--------------------------------------------------------------------------------

C#枚舉的賦值

Q:枚舉成員的值是怎樣規(guī)定的?

A:如果你沒有手動指定成員的值的話,從上往下看,各成員的值為:0, 1, 2, ...。說罷了,就是一個非負(fù)整數(shù)等差數(shù)列,其初值為0,步長為1。例如:

 
 
 
  1. // Code #10
  2. public enum Alignment
  3. {
  4.     Left,    // 0
  5.     Center,    // 1
  6.     Right    // 2
  7. }

--------------------------------------------------------------------------------

Q:如果我有手動指定某些成員的值呢?

A:那么被賦值的成員的值就是你所指定的值。當(dāng)然,無論你是否手動指定枚舉成員的值,遞增步長都不會變,總是為1。為了測試你是否理解,請說出下面枚舉個成員的值以及你的判斷理由(請用人腦而不是電腦來運行以下代碼):

 
 
 
  1. // Code #11
  2. public enum DriveType : sbyte
  3. {
  4.     CDRom,
  5.     Fixed = -2,
  6.     Network,
  7.     NoRootDirectory = -1,
  8.     Ram,
  9.     Removable = Network * NoRootDirectory,
  10.     Unknown
  11. }

--------------------------------------------------------------------------------

Q:我們?nèi)绾潍@取枚舉成員的值,無論成員是否被手動賦值?

A:你可以使用System.Enum的

 
 
 
  1. public static Array GetValues(Type enumType);

該方法返回一個包含所有枚舉成員的數(shù)組:

 
 
 
  1. // Code #12
  2. // See Code #01 for Alignment.
  3. public static void Main()
  4. {
  5.     Alignment[] alignments = (Alignment[])Enum.GetValues(typeof(Alignment));
  6.     Console.WriteLine("Wanna see the values of Alignment's menbers?");
  7.     foreach (Alignment a in alignments)
  8.         Console.WriteLine("{0:G} = {0:D}", a);
  9. }
  10. // Output:
  11. // Wanna see the values of Alignment's menbers?
  12. // Left = 0
  13. // Center = 1
  14. // Right = 2

--------------------------------------------------------------------------------

Q:如果我只需要其中某些枚舉成員的值呢?

A:那么你可以把枚舉轉(zhuǎn)換為IConvertible接口,再調(diào)用對應(yīng)的方法:

 
 
 
  1. // Code #12
  2. // See Code #01 for Alignment.
  3. public static void Main()
  4. {
  5.     IConvertible ic = (IConvertible)Alignment.Center;
  6.     int i = ic.ToInt32(null);
  7.     Console.WriteLine("The value of Alignment.Center is {0}.", i);
  8. }
  9. // Output:
  10. // The value of Alignment.Center is 1.

--------------------------------------------------------------------------------

Q:為什么需要手動指定枚舉成員的值?

A:一般情況下,使用默認(rèn)的賦值規(guī)則就足夠了,但某些情況下,為枚舉成員指定一個與實際情況(模型)相符的值可能更有意義,這要視你具體所建的模型而定。

還是讓我們來一個實際的例子:

 
 
 
  1. // Code #13
  2. public enum CustomerKind
  3. {
  4.     Normal = 90,
  5.     Vip = 80,
  6.     SuperVip = 70,
  7.     InActive = 100
  8. }
  9. public class Customer
  10. {
  11.     public readonly CustomerKind Kind;
  12.     private double m_Payment;
  13.     public double Payment
  14.     {
  15.         return m_Payment * (int)Kind / 100;
  16.     }
  17.     // Code here
  18. }

我為枚舉CustomerKind的每個成員都賦了一個特定的值,該值其實就是顧客購物折扣百分率。而在Customer類中,Payment屬性就通過強類型轉(zhuǎn)換來獲取枚舉成員的值(也就是購物折扣率),并用于貨款計算。從這里可以看出,獲取枚舉成員的值還可以通過強類型轉(zhuǎn)換方式。

--------------------------------------------------------------------------------

Q:既然枚舉類型可以強制轉(zhuǎn)換為整數(shù),那么整數(shù)是否也可以強制轉(zhuǎn)換為枚舉類型?

A:答案是肯定的。

 
 
 
  1. // Code #14
  2. // See Code #01 for Alignment.
  3. Alignment a = (Alignment)1;

但這種機制可能使你遇到一些麻煩:

 
 
 
  1. // Code #15
  2. // See Code #01 for Alignment.
  3. class Program
  4. {
  5.     static void Main()
  6.     {
  7.         Foo((Alignment)12345);
  8.     }
  9.     static void Foo(Alignment a)
  10.     {
  11.         // Code here
  12.     }
  13. }

你無法避免有人進(jìn)行這樣的惡作劇?。?/p>

--------------------------------------------------------------------------------

Q:那么是否有辦法對付這些惡作劇的人?

A:Sure!我們總不能假設(shè)人人都那么守規(guī)矩,所以,我們需要System.Enum的

 
 
 
  1. public static bool IsDefined(Type enumType, object value);

現(xiàn)在我們把Code #15的Foo方法改進(jìn)一下:

 
 
 
  1. // Code #16
  2. // See Code #01 for Alignment.
  3. static void Foo(Alignment a)
  4. {
  5.     if (!Enum.IsDefined(typeof(Alignment), a))
  6.         throw new ArgumentException("DO NOT MAKE MISCHIEF!");
  7.     // Code here
  8. }

這樣,惡作劇的人將會收到一個警告(異常消息)。當(dāng)然,我們不排除有人是由于一時大意才造成這樣的“惡作劇”,那么IsDefined方法同樣可以幫助你處理好這些情況。

--------------------------------------------------------------------------------

Q:我認(rèn)為我們還可以使用條件判斷語句來處理這種情況:

 
 
 
  1. // Code #17
  2. // See Code #01 for Alignment.
  3. static void Foo(Alignment a)
  4. {
  5.     if (a != Alignment.Left &&
  6.         a != Alignment.Center &&
  7.         a != Alignment.Right)
  8.         throw new ArgumentException("DO NOT MAKE MISCHIEF!");
  9.     // Code here
  10. }

或者

 
 
 
  1. // Code #18
  2. // See Code #01 for Alignment.
  3. static void Foo(Alignment a)
  4. {
  5.     switch(a)
  6.     {
  7.         case Alignment.Left:
  8.             Console.WriteLine("Cool~");
  9.             break;
  10.         case Alignment.Center:
  11.             Console.WriteLine("Well~");
  12.             break;
  13.         case Alignment.Right:
  14.             Console.WriteLine("Good~");
  15.             break;
  16.         default:
  17.             Console.WriteLine("DO NOT MAKE MISCHIEF!");
  18.             break;
  19.     }
  20. }

A:你絕對可以這樣做!事實上,如果你處于以下情況之一的話:

1. Alignment枚舉代碼不會被修改
2. 你不希望使用Alignment枚舉新增的特性

那么我會推薦使用你的處理方式。而且,你還可以為自己的代碼定義一個這樣的方法:

 
 
 
  1. // Code #19
  2. // See Code #01 for Alignment.
  3. public static bool IsAlignment(Alignment a)
  4. {
  5.     switch(a)
  6.     {
  7.         case Alignment.Left:
  8.             return true;
  9.         case Alignment.Center:
  10.             return true;
  11.         case Alignment.Right:
  12.             return true;
  13.         default:
  14.             return false;
  15.     }
  16. }

這個方法比起IsDefine方法高效多了。

--------------------------------------------------------------------------------

以上就總結(jié)了一些C#枚舉賦值的相關(guān)問答。


網(wǎng)站名稱:有關(guān)C#枚舉的問答集錦:有關(guān)賦值
文章起源:http://www.dlmjj.cn/article/cddgied.html