# Enum是什麼?
在 C# 中,enum(列舉)是一種特殊的數據類型,用來定義一組命名的整數常數。它可以讓你將一組相關的常數組織在一起,並使用有意義的名稱來表示這些常數,而不是直接使用數字。這樣可以使代碼更具可讀性和可維護性。
### enum 的基本概念
定義:你可以使用 enum 關鍵字來定義一個列舉類型。列舉類型中的每個成員都對應一個整數值。
用途:列舉主要用於表示固定的、有限的選項或狀態。例如,星期幾、顏色、訂單狀態等。
---
### 如何定義和使用 enum
1. 定義列舉
你可以定義一個列舉類型,例如:
```
public enum DaysOfWeek
{
Sunday, // 默認值是 0
Monday, // 默認值是 1
Tuesday, // 默認值是 2
Wednesday, // 默認值是 3
Thursday, // 默認值是 4
Friday, // 默認值是 5
Saturday // 默認值是 6
}
```
這段代碼定義了一個名為 DaysOfWeek 的列舉,它包含了一周七天的名稱。每個成員都對應一個整數值,從 0 開始,依次遞增。
2. 使用列舉
你可以使用列舉來表示特定的值:
```
DaysOfWeek today = DaysOfWeek.Monday;
if (today == DaysOfWeek.Monday)
{
Console.WriteLine("今天是星期一");
}
```
3. 自定義整數值
你也可以手動指定列舉成員的整數值:
```
public enum ErrorCode
{
Success = 0,
NotFound = 404,
Unauthorized = 401,
InternalError = 500
}
```
4. 各種基本操作
```
using System;
class Program
{
// 定義一個枚舉類型 State,其中包含幾個狀態值
public enum Fruits
{
Apple, // 默認為 0
Mango, // 默認為 1
Banana, // 默認為 2
Tomato, // 默認為 3
Lemon = 9 // 顯式指定 Lemon 的值為 9
}
// Main 方法是程式的進入點
public static void Main()
{
// 定義一個 Fruits 類型的變數 fruit,並初始化為 Apple 狀態
Fruits fruit = Fruits.Apple;
// 列出 Fruits 枚舉中的所有名稱
foreach (string en in Enum.GetNames(typeof(Fruits)))
Console.WriteLine("Enum Name: " + en);
// 列舉 Fruits 枚舉中的所有值
// 在這段程式碼中,fruit 是一個類型為 Fruits 的變數。
// fruit.GetType() 方法返回這個變數的 "Type" 物件。
// 由於 fruit 是 Fruits 枚舉的實例,因此 fruit.GetType() 返回的是 Fruits 類型的 Type 物件。
foreach (int v in Enum.GetValues(fruit.GetType()))
Console.WriteLine("Enum Value: " + v.ToString());
// 將枚舉值轉換為字串
Console.WriteLine("Enum To String: " + fruit.ToString());
// 將字串轉換為枚舉值(true-忽略大小寫)
fruit = (Fruits)Enum.Parse(typeof(Fruits), "Banana", true);
Console.WriteLine("String To Enum: " + fruit);
// 測試將一個無效的字串轉換為枚舉
try
{
Console.WriteLine("String To Enum(not found): " +
Enum.Parse(typeof(Fruits), "aaa"));
}
catch (Exception ex)
{
Console.WriteLine("Error when Enum.Parse: " + ex.Message);
}
// 將枚舉值轉換為對應的整數
Console.WriteLine("Enum to Int: " + fruit + " " + (int)fruit);
// 將整數轉換回枚舉值
fruit = (Fruits)9;
Console.WriteLine("Int to Enum: " + fruit);
// 將不存在於枚舉中的整數轉換為枚舉類型不會拋出錯誤!!
fruit = (Fruits)100;
Console.WriteLine("Int(100) to Enum: " + fruit);
// 範例展示如何取得下一個和上一個枚舉值
fruit = Fruits.Banana;
Fruits next = (Fruits)((int)fruit + 1);
Fruits prev = (Fruits)((int)fruit - 1);
Console.WriteLine("Now = " + fruit + " Next = " + next + " Prev = " + prev);
}
}
Output:
Enum Name: Apple
Enum Name: Mango
Enum Name: Banana
Enum Name: Tomato
Enum Name: Lemon
Enum Value: 0
Enum Value: 1
Enum Value: 2
Enum Value: 3
Enum Value: 9
Enum To String: Apple
String To Enum: Banana
Error when Enum.Parse: Requested value 'aaa' was not found.
Enum to Int: Banana 2
Int to Enum: Lemon
Int(100) to Enum: 100
Now = Banana Next = Tomato Prev = Mango
```
在這裡,Success 的值是 0,NotFound 的值是 404,以此類推。這樣你可以將列舉成員的值設置為更具意義的數字。
### 列舉的優點
* 可讀性:使用列舉可以提高代碼的可讀性,因為它用有意義的名稱代替數字。
* 安全性:列舉使代碼更加安全,因為你只能使用列舉中定義的值,這樣可以避免使用無效的數字。
* 維護性:當你需要修改列舉的值時,只需在列舉定義中更改一次,代碼中的所有引用都會自動更新。
# Enum.TryParse 的用法
`Enum.TryParse(字串, out 列舉變量);`
* 字串:你想要轉換的字串,比如 "orderStatusString"。
* 列舉變量:用來存儲轉換結果的變量,這個變量必須是對應列舉類型的。
## 實際例子
假設你在開發一個線上訂餐系統,你有一個列舉類型 OrderStatus 來表示訂單的狀態,定義如下:
```
public enum OrderStatus
{
Pending,
Preparing,
Completed,
Cancelled
}
```
你收到了一個來自前端的訂單狀態字串(例如從用戶界面發送過來的狀態信息),並需要將這個字串轉換為 OrderStatus 列舉,以便進行進一步處理。
假設你收到的狀態字串是 "Preparing",你可以使用 Enum.TryParse 將這個字串轉換為 OrderStatus 列舉,然後根據狀態做出相應的操作:
```
string orderStatusString = "Preparing";
OrderStatus status;
if (Enum.TryParse(orderStatusString, out status))
{
// 如果轉換成功,status 現在是 OrderStatus.Preparing
Console.WriteLine($"訂單狀態是: {status}");
// 根據狀態執行不同的操作
switch (status)
{
case OrderStatus.Pending:
Console.WriteLine("訂單待處理。");
break;
case OrderStatus.Preparing:
Console.WriteLine("訂單正在準備中。");
break;
case OrderStatus.Completed:
Console.WriteLine("訂單已完成。");
break;
case OrderStatus.Cancelled:
Console.WriteLine("訂單已取消。");
break;
}
}
else
{
// 如果轉換失敗
Console.WriteLine("無法解析訂單狀態。");
}
```
參考資料:
[教學](https://www.youtube.com/watch?v=3p0OJErAbEI)
[為何好用?](https://www.youtube.com/watch?v=RtDmJg7HElc)
:::spoiler 解釋:
收到的字串:從前端發來的字串 "Preparing" 代表訂單正在準備中。
Enum.TryParse 的作用:將 "Preparing" 這個字串轉換為 OrderStatus.Preparing 列舉值。
轉換成功:你可以使用 status 變量來檢查訂單狀態並執行相應的操作,例如顯示正在準備中的信息。
轉換失敗:如果傳入的字串不符合任何一個列舉值,Enum.TryParse 會返回 false,你可以處理這種情況,比如顯示錯誤信息。
這樣,你就能用 Enum.TryParse 將字串轉換為列舉,從而方便地處理不同的訂單狀態。