程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#枚舉的初始化(3)

C#枚舉的初始化(3)

編輯:關於C語言

為什麼會這樣呢?讓我們從IL代碼中看看編譯器是如何理解此時的Main的:

// Code #05
.method private hidebysig static void Main(string[] args) cil managed
{
   .entrypoint
   // Code Size: 50 byte(s)
   .maxstack 2
   .locals (
      CsWritingLab.Alignment alignment1,
      CsWritingLab.Alignment alignment2)
   L_0000: nop
   L_0001: ldc.i4.0
   L_0002: stloc.0
   L_0003: ldloc.0
   L_0004: box CsWritingLab.Alignment
   L_0009: ldstr "D"
   L_000e: call instance string [mscorlib]System.Enum:string)
   L_0013: call void [mscorlib]System.Console::WriteLine(string)
   L_0018: nop
   L_0019: ldc.i4.1
   L_001a: stloc.1
   L_001b: ldloc.1
   L_001c: box CsWritingLab.Alignment
   L_0021: ldstr "D"
   L_0026: call instance string [mscorlib]System.Enum:string)
   L_002b: call void [mscorlib]System.Console::WriteLine(string)
   L_0030: nop
   L_0031: ret
}

從上面的IL代碼中,我們可以看出這兩種初始化方式已經不再被理解為一樣的了。對比Code #03和Code #05,你會發現,改變的僅僅是L_0019行:

ldc.i4.0 -> ldc.i4.1

也就是說,使用枚舉的第一個成員來初始化枚舉變量,編譯器懂得根據枚舉的定義來作出相應的調整,從而編譯出符合我們預期的代碼。這種處理方式實際上使用了多態性的思維。

而此時,

Alignment a = new Alignment();

相當於

Alignment a = (Alignment)0;

或者

Alignment a = 0;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved