文章目錄
Enum in C#
最近跟同事討論 enum 相關應用時剛好同事問到 enum 可以用什麼型別,無奈學藝不精沒有答出完整正確答案XD,剛好趁這個機會順便整理一下。
基本特性
- 名稱中不得包含空白字元
預設值為
0建議可以將商業邏輯上最適合的值設為
0或是 直接指定Default=0未指定下,Value 以
1累加預設型別為
int, 可透過:指定使用其他整數數字型別(Numeric Type)enum Days:byte { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
Value 可以有計算式
enum MachineState { PowerOff = 0, Running = 5, Sleeping = 10, Hibernating = Sleeping + 5 }
Enum 取代數字的好處
- 可以初步過濾掉無效值(ex:
星期欄位可以控制不出現8這種無效數值) - IntelliSense 提示
允許使用的資料型別
只要是整數數字型別(Numeric Type)都是被允許的
Allow Type List
No. Type Range Size .NET Framework 型別 特殊說明 宣告方式 1 byte 0 至 255 不帶正負號的 8 位元整數 System.Byte - byte myByte = 255; 2 sbyte -128 至 127 帶正負號的 8 位元整數 System.SByte - sbyte sByte1 = 127; 3 short -32,768 至 32,767 帶正負號的 16 位元整數 System.Int16 - short x = 32767; 4 ushort 0 至 65,535 不帶正負號的 16 位元整數 System.UInt16 - ushort myShort = 65535; 5 int -2,147,483,648 至 2,147,483,647 帶正負號的 32 位元整數 System.Int32 預設值為 0 int i = 123; 6 uint 0 至 4,294,967,295 不帶正負號的 32 位元整數 System.UInt32 注意:uint 型別不符合 CLS 標準。 請儘可能使用 int uint myUint = 4294967290;//4294967290u//4294967290U 7 long -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 帶正負號的 64 位元整數 System.Int64 - long long1 = 4294967296;//4294967296L 8 ulong 0 至 18,446,744,073,709,551,615 不帶正負號的 64 位元整數 System.UInt64 - ulong uLong = 9223372036854775808; // LorI會依大小決定是longorulong;Uoru會依大小決定是unitorulong;UL、ul、Ul、uL、LU、lu、Lu或lU則會是ulong
其他用法
Bit Flag(位元旗標)
- 位元運算效能較佳
0表示未設定- 在 enum 套用
System.FlagsAttribute屬性 可以用一個欄位儲存數個選項
範例以下列 Days 為例,要表示星期一、三、五,需用
1,3,5(變成字串操作)enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };如果改用 Days2 ,星期一、三、五,只要直接存
30((Monday = 0x2) + (Wednesday = 0x8) + (Friday = 0x20))[Flags] enum Days2 { None = 0x0,//0;// 0 << 0 Sunday = 0x1,//1;// 1 << 0 Monday = 0x2,//2;// 1 << 1 Tuesday = 0x4,//4;// 1 << 2 Wednesday = 0x8,//8;// 1 << 3 Thursday = 0x10,//16;// 1 << 4 Friday = 0x20,//32;// 1 << 5 Saturday = 0x40//64;// 1 << 6 }
使用
&(AND)、|(OR)、~(NOT) 和^(XOR) 位元運算子範例
// 使用 `OR`初始化 Days2 meetingDays = Days2.Tuesday | Days2.Thursday; // 20 // 使用 `OR` 增加 friday. meetingDays = meetingDays | Days2.Friday; // 52 // 使用 `AND` 取得 Tuesday, Friday meetingDays&(Days2.Tuesday | Days2.Friday) //36 // 使用 `XOR` 移除 Tuesday. meetingDays = meetingDays ^ Days2.Tuesday; //48
使用
System.Enum的型別Method指定 Value 取得名稱
Enum.GetName(typeof(Days), 4)
取得所有 Value 陣列
Enum.GetValues(typeof(Days))
取得所有 Name 陣列
Enum.GetNames(typeof(Days))
參考資料
文章作者 Yowko Tsai
上次更新 2021-11-03
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。
