首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作枚舉模式:從類別模擬到 Java 枚舉對比

     編輯:關於C語言

以類別模擬枚舉的經典做法

在 C# 早期版本或特定情境下,開發者常用唯讀靜態欄位的類別來模擬枚舉行為。這種方式雖然可行,但已偏離 enum 本意,且缺乏型別安全與編譯時檢查。

1. 傳統類別模擬法

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 中使用、無法限制傳入參數型別、序列化需額外處理。

2. Java 枚舉的強大功能

Java 的 enum 實質是編譯器生成的 final class,支援:

  • 建構函式、欄位、方法
  • 介面實作與抽象方法
  • 每個常數可有專屬實作(常數專用類別主體)

Java 範例:運算子枚舉

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);
}

3. C# 的現代替代方案:Smart Enum

如前文所述,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; }
}

4. 總結建議

場景推薦做法
單純常數集合原生 enum
需攜帶資料/描述enum + DescriptionAttribute + 擴充方法
需多型行為/介面實作Smart Enum(單例抽象類別)
舊版專案相容唯讀靜態類別(不推薦新專案)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved