自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

有關(guān)C#枚舉的問答集錦:有關(guān)賦值

開發(fā) 后端
本文匯總了一些有關(guān)C#枚舉的問答。本文是第二部分,匯總了一些有關(guān)枚舉賦值的相關(guān)問答。

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

Q:我留意到Code #02中的

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

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

A:這說明枚舉類型與整數(shù)類型的確有一定的關(guān)系。事實上,每一個枚舉類型都有與之相對應的整數(shù)類型,我們稱該整數(shù)類型為底層類型(underlying type),默認的情況下使用,.NET使用System.Int32。當然,你可以手動將其指定為其他的整數(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:你完全可以讓它接受默認的底層類型。請留意Code #08,你完全找不到“Center”這個字眼,然而在C#代碼中,它卻是存在的,為什么呢?這是因為代碼在編譯的時候,編譯器把枚舉類型轉(zhuǎn)換為與之對應的底層類型的數(shù)值來處理。Code #08的L_0000實際上就是把類型為System.Int32的數(shù)值1推入堆棧,而不是把“Center”推入堆棧。事實上,底層類型說明了如何為枚舉類型分配空間,不同的底層類型所占用的資源不同,大概當你在受限系統(tǒng)上進行開發(fā)的話,你就可能需要注意一下了。

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

C#枚舉的賦值

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

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

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

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

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

A:那么被賦值的成員的值就是你所指定的值。當然,無論你是否手動指定枚舉成員的值,遞增步長都不會變,總是為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.  
  11. // Output:  
  12. // Wanna see the values of Alignment's menbers?  
  13. // Left = 0  
  14. // Center = 1  
  15. // Right = 2  

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

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

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

  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.  
  10. // Output:  
  11. // The value of Alignment.Center is 1.  

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

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

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

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

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

我為枚舉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.  
  10.     static void Foo(Alignment a)  
  11.     {  
  12.         // Code here  
  13.     }  
  14. }  

你無法避免有人進行這樣的惡作?。?!

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

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

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

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

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

  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.  
  8.     // Code here  
  9. }  

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

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

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

  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.  
  10.     // Code here  
  11. }  

或者

  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)問答。

【編輯推薦】

  1. 有關(guān)C#枚舉的問答集錦:基礎(chǔ)篇
  2. C#枚舉和數(shù)學習經(jīng)驗總結(jié)
  3. 淺談如何利用C#枚舉所有的窗體
  4. C#記憶功能的地址欄控件
  5. 描述C#調(diào)用外部進程
責任編輯:yangsai 來源: CSDN博客
相關(guān)推薦

2009-08-11 14:44:24

C#枚舉

2009-08-11 15:24:03

C#枚舉

2010-08-12 18:01:38

ibmdwJazz

2010-12-29 09:51:06

配置vsftpdDebian

2011-06-13 10:30:07

Linus Torva

2009-06-11 13:00:08

Java數(shù)組賦值

2012-07-05 09:42:08

jQuery

2010-06-02 13:30:10

IPv6標準

2010-03-12 09:47:22

2009-08-18 10:30:30

C#枚舉

2018-02-06 10:07:18

RAID 5磁盤陣列數(shù)據(jù)恢復

2009-08-21 18:05:23

ASP.NET Ses

2011-03-03 13:25:57

2009-08-13 14:52:21

.NET性能誤區(qū)C#和VB.NET

2010-01-28 13:15:43

C++參數(shù)

2010-01-18 16:14:43

配置VLAN交換機

2010-01-20 09:14:49

C語言模塊化

2009-12-29 14:41:12

ADSL常見硬件問題

2018-01-31 10:58:27

2009-08-17 18:31:39

C# 枚舉
點贊
收藏

51CTO技術(shù)棧公眾號