成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

有關(guān)C#枚舉的問(wèn)答集錦:基礎(chǔ)篇

開(kāi)發(fā) 后端
本文匯總了一些有關(guān)C#枚舉的問(wèn)答。本文是第一部分,截取了基礎(chǔ)方面的問(wèn)答十則。

Q:在C#里,我們?nèi)绾伪磉_(dá)枚舉類型?

A:你可以使用enum關(guān)鍵字(keyword)來(lái)聲明一個(gè)枚舉類型(enum type):

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

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

Q:C#枚舉類型是值類型(value type)還是引用類型(reference type)?

A:枚舉類型都是值類型。

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

Q:System.Enum是枚舉類型么?

A:不是。

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

Q:System.Enum與枚舉類型(enum type)有什么關(guān)系?

A:System.Enum是一個(gè)抽象類(abstract class),所有枚舉類型都直接繼承自它,當(dāng)然也同時(shí)繼承了它的所有成員。

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

Q:那么System.Enum屬于引用類型啦?

A:是的。

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

Q:既然System.Enum是引用類型,而枚舉類型又是直接繼承自System.Enum的,那為什么枚舉類型卻不是引用類型?

A:這種繼承關(guān)系是隱式的并由編譯器負(fù)責(zé)展開(kāi),上面Code #1的Alignment枚舉被展開(kāi)后的IL代碼如下:

  1. // Code #02  
  2. .class public auto ansi sealed Aligment  
  3.        extends [mscorlib]System.Enum  
  4. {  
  5.     .field public static literal Aligment Left = int32(0x00000000)  
  6.     .field public static literal Aligment Center = int32(0x00000001)  
  7.     .field public static literal Aligment Right = int32(0x00000002)  
  8.  
  9.     .field public specialname rtspecialname int32 value__  
  10. }  

從聲明中,你可以看到Aligment的確是繼承自System.Enum的,只是你不能在C#里顯式聲明這種繼承關(guān)系。

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

Q:但你好像沒(méi)有回答為什么枚舉類型繼承自一個(gè)引用類型后,卻還是值類型!

A:你知道,所有的值類型都是System.ValueType的后代,枚舉類型也不例外,枚舉類型直接繼承自System.Enum,而System.Enum卻又直接繼承自System.ValueType的,所以,枚舉類型也是System.ValueType的后代。

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

Q:慢著!從System.ValueType派生出來(lái)的類型不都應(yīng)該是值類型嗎?為什么System.Enum會(huì)是引用類型?

A:正確的說(shuō)法應(yīng)該是“值類型都是System.ValueType的后代”,但System.ValueType的后代不全是值類型,System.Enum就是***的特例!在System.ValueType的所有后代中,除了System.Enum之外其它都是值類型。事實(shí)上,我們可以在.NET的源代碼中找到System.Enum的聲明:

  1. public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible  

請(qǐng)注意,.NET Framework SDK v2.0.3600.0 Documentation中的Enum聲明是錯(cuò)的:

public abstract struct Enum : IComparable, IFormattable, IConvertible

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

Q:開(kāi)始頭暈了,究竟C#枚舉類型、System.Enum、System.ValueType、值類型和引用類型之間存在著什么樣的關(guān)系?

A:簡(jiǎn)單的說(shuō),

1. 所有枚舉類型(enum type)都是值類型。
2. System.Enum和System.ValueType本身是引用類型。
3. 枚舉類型(enum type)都是隱式的直接繼承自System.Enum,并且這種繼承關(guān)系只能由編譯器自動(dòng)展開(kāi)。但System.Enum本身不是枚舉類型(enum type)。
4. System.Enum是一個(gè)特例,它直接繼承自System.ValueType(參見(jiàn)Code #03),但本身卻是一個(gè)引用類型。
好吧,現(xiàn)在來(lái)看看下面代碼,你能猜得出它的輸出結(jié)果嗎?

  1. // Code #04  
  2. static void Main()  
  3. {  
  4.     Type t = typeof(System.Enum);  
  5.  
  6.     if (t.IsEnum)  
  7.         Console.WriteLine("I'm enum type.");  
  8.  
  9.     if (t.IsValueType)  
  10.         Console.WriteLine("I'm value type.");  
  11. }  

請(qǐng)別驚訝于程序的運(yùn)行結(jié)果沒(méi)有任何輸出!對(duì)于***個(gè)判斷,我們很清楚System.Enum并不是枚舉類型。但第二個(gè)判斷呢?System.Enum明明繼承自System.ValueType,卻不承認(rèn)是System.ValueType的后代!這是.NET上的一個(gè)特例,恰恰體現(xiàn)出System.Enum是特殊性。

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

Q:既然枚舉類型是值類型,自然會(huì)涉及到裝箱和拆箱(boxing and unboxing)的問(wèn)題,那么枚舉類型會(huì)被裝箱成什么呢?[Updated]

A:枚舉類型可以被裝箱成System.Enum、System.ValueType、System.Object或者System.IConvertible、System.IFormattable、System.IComparable。

注意:在.NET 1.1上,枚舉類型只能被裝箱到System.Enum、System.ValueType、System.Object;而在.NET 2.0上,枚舉類型還能被裝箱到System.Enum所實(shí)現(xiàn)的三個(gè)接口:System.IConvertible、System.IComparable、System.IFormattable。對(duì)應(yīng)的裝箱操作既可以為隱式的也可以是顯式的。

下面的C#代碼:

  1. // Code #05  
  2. // See Code #01 for Alignment.  
  3. static void Main()  
  4. {  
  5.     Alignment a = Alignment.Center;  
  6.  
  7.     Console.WriteLine(a.ToString());  
  8.  
  9.     Console.WriteLine(a);  
  10. }  

對(duì)應(yīng)的IL代碼是:

  1. // Code #06  
  2. .method private hidebysig static void Main() cil managed  
  3. {  
  4.     .entrypoint  
  5.     // Code Size: 32 byte(s)  
  6.     .maxstack 1  
  7.     .locals (  
  8.           EnumerationFaq.Alignment alignment1)  
  9.     L_0000: ldc.i4.1   
  10.     L_0001: stloc.0   
  11.     L_0002: ldloc.0   
  12.     L_0003: box EnumerationFaq.Alignment  
  13.     L_0008: call instance string [mscorlib]System.Enum::ToString()  
  14.     L_000d: call void [mscorlib]System.Console::WriteLine(string)  
  15.     L_0012: nop   
  16.     L_0013: ldloc.0   
  17.     L_0014: box EnumerationFaq.Alignment  
  18.     L_0019: call void [mscorlib]System.Console::WriteLine(object)  
  19.     L_001e: nop   
  20.     L_001f: ret   
  21. }  

從IL代碼中我們可以看到枚舉類型被裝箱兩次。***次(L_0003)被裝箱成System.Enum,而第二次(L_0014)就被裝箱成System.Object。

但如果你讓編譯器自動(dòng)為你選擇裝箱類型的話,它會(huì)優(yōu)先考慮System.Enum:

  1. // Code #07  
  2. // See Code #01 for Alignment.  
  3. class Program  
  4. {  
  5.     static void Main()  
  6.     {  
  7.         Alignment a = Alignment.Center;  
  8.  
  9.         Print(a);  
  10.     }  
  11.  
  12.     static void Print(IConvertible c)  
  13.     {  
  14.         Console.WriteLine(c);  
  15.     }  
  16.  
  17.     static void Print(IFormattable f)  
  18.     {  
  19.         Console.WriteLine(f);  
  20.     }  
  21.  
  22.     static void Print(IComparable c)  
  23.     {  
  24.         Console.WriteLine(c);  
  25.     }  
  26.  
  27.     static void Print(Object o)  
  28.     {  
  29.         Console.WriteLine(o);  
  30.     }  
  31.  
  32.     static void Print(ValueType v)  
  33.     {  
  34.         Console.WriteLine(v);  
  35.     }  
  36.  
  37.     static void Print(Enum e)  
  38.     {  
  39.         Console.WriteLine(e);  
  40.     }  
  41. }  

上面的代碼將被編譯成如下的IL:

  1. // Code #08  
  2. .method private hidebysig static void Main(string[] args) cil managed  
  3. {  
  4.     .entrypoint  
  5.     // Code Size: 15 byte(s)  
  6.     .maxstack 1  
  7.     .locals (  
  8.           EnumerationFaq.Alignment alignment1)  
  9.     L_0000: ldc.i4.1   
  10.     L_0001: stloc.0   
  11.     L_0002: ldloc.0   
  12.     L_0003: box EnumerationFaq.Alignment  
  13.     // 調(diào)用static void Print(Enum e);  
  14.     L_0008: call void EnumerationFaq.Program::Print([mscorlib]System.Enum)  
  15.     L_000d: nop   
  16.     L_000e: ret   
  17. }  

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

以上就是有關(guān)C#枚舉類型的一些問(wèn)答,更多問(wèn)答待續(xù)。

【編輯推薦】

  1. C#枚舉和數(shù)學(xué)習(xí)經(jīng)驗(yàn)總結(jié)
  2. 淺談如何利用C#枚舉所有的窗體
  3. C#記憶功能的地址欄控件
  4. 描述C#調(diào)用外部進(jìn)程
  5. C#語(yǔ)言操縱數(shù)據(jù)庫(kù)事務(wù)
責(zé)任編輯:yangsai 來(lái)源: CSDN博客
相關(guān)推薦

2009-08-11 14:55:44

C#枚舉

2009-08-11 15:24:03

C#枚舉

2010-08-12 18:01:38

ibmdwJazz

2010-12-29 09:51:06

配置vsftpdDebian

2012-07-05 09:42:08

jQuery

2010-03-12 09:47:22

2009-08-18 13:00:59

C#枚舉類型

2009-08-18 10:30:30

C#枚舉

2011-03-03 13:25:57

2010-06-02 13:30:10

IPv6標(biāo)準(zhǔn)

2010-01-18 16:14:43

配置VLAN交換機(jī)

2009-08-18 11:07:06

C#枚舉類型

2009-12-29 14:41:12

ADSL常見(jiàn)硬件問(wèn)題

2009-08-18 09:37:14

C#枚舉類型

2009-08-18 13:35:06

C#枚舉文件

2009-08-17 18:31:39

C# 枚舉

2009-09-01 17:08:35

C# Color枚舉

2009-08-18 10:35:46

C#枚舉類型

2009-08-18 12:52:33

C#枚舉類型

2009-08-17 17:56:32

C# 枚舉
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 免费一看一级毛片 | 精品亚洲一区二区三区 | 国产精品欧美日韩 | 在线国产一区二区三区 | 在线综合视频 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 性福视频在线观看 | 国产毛片久久久 | 亚洲欧美日韩久久 | 美女久久久久久久久 | 久久午夜精品福利一区二区 | 日韩av福利在线观看 | 一级二级三级在线观看 | 欧美日韩在线视频一区 | 国产精品一区二区av | 亚洲精品久久久久中文字幕欢迎你 | 国产免费观看久久黄av片涩av | 亚洲免费在线观看av | 国产精品一区二区三区久久 | 一区二区高清不卡 | 国产一区免费视频 | 久久av一区 | 久久中文字幕一区 | 草久网| 国产一区二区在线播放 | 翔田千里一区二区 | 亚洲日韩欧美一区二区在线 | 欧美韩一区二区三区 | 国产精品久久网 | 麻豆精品国产91久久久久久 | 久久久久国产精品午夜一区 | 亚洲电影免费 | 亚洲啪啪 | 狠狠躁夜夜躁人人爽天天高潮 | 涩涩导航 | 久久精品99久久 | www.国产精 | 欧美黑人国产人伦爽爽爽 | 亚洲精品成人av久久 | 中文字幕在线观看 | 日韩国产在线 |