在 C# 早期版本或特定情境下,開發者常用唯讀靜態欄位的類別來模擬枚舉行為。這種方式雖然可行,但已偏離 enum 本意,且缺乏型別安全與編譯時檢查。
public class SeasonOne
{
public static readonly SeasonOne Spring = new SeasonOne("春天");
public static readonly SeasonOne Summer = new SeasonOne("夏天");
public static readonly SeasonOne Autumn = new SeasonOne("秋天");
public static readonly SeasonOne Winter = new SeasonOne("冬天");
private SeasonOne(string name) => Name = name;
public string Name { get; private set; }
}
// 使用
Console.WriteLine(SeasonOne.Autumn.Name); // 輸出:秋天
缺點:無法在 switch 中使用、無法限制傳入參數型別、序列化需額外處理。
Java 的 enum 實質是編譯器生成的 final class,支援:
public enum Operator {
ADD { public double calc(double a, double b) => a + b; },
SUB { public double calc(double a, double b) => a - b; },
MUL { public double calc(double a, double b) => a * b; },
DIV { public double calc(double a, double b) => a / b; };
public abstract double calc(double a, double b);
}
如前文所述,C# 可用密封抽象類別 + 私有巢狀類別達到同等效果,並保有型別安全:
public abstract class Operator
{
public static readonly Operator Add = new AddOp();
public static readonly Operator Sub = new SubOp();
// ...
public abstract double Calc(double a, double b);
private sealed class AddOp : Operator { public override double Calc(double a, double b) => a + b; }
private sealed class SubOp : Operator { public override double Calc(double a, double b) => a - b; }
}
| 場景 | 推薦做法 |
|---|---|
| 單純常數集合 | 原生 enum |
| 需攜帶資料/描述 | enum + DescriptionAttribute + 擴充方法 |
| 需多型行為/介面實作 | Smart Enum(單例抽象類別) |
| 舊版專案相容 | 唯讀靜態類別(不推薦新專案) |