共用方式為


列舉型別設計

更新:2007 年 11 月

列舉型別提供一些常數值集合,這些集合對於設定強型別成員及改善程式碼的可讀性都很有用處。列舉型別是簡單或旗標列舉型別;簡單列舉型別包含了未在位元 (Bitwise) 比較中結合或使用的值,旗標列舉型別的目的是要使用位元 OR 運算來結合。可利用位元 AND 運算來檢查旗標列舉值的組合。

下列方針將描述列舉型別設計的最佳作法。

要優先使用列舉型別,而非靜態常數。

下列程式碼範例將示範錯誤的設計。

Public Class BadFurnishings

    Public Shared Table As Integer = 1
    Public Shared Chair As Integer = 2
    Public Shared Lamp As Integer = 3

End Class
public static class BadFurnishings
{
    public static int Table = 1;
    public static int Chair = 2;
    public static int Lamp = 3;
}

下列程式碼範例將示範應該用來取代靜態常數的列舉型別。

Public Enum GoodFurnishings

    Table
    Chair
    Lamp

End Enum
public enum GoodFurnishings
{
    Table,
    Chair,
    Lamp
}

不要將列舉型別用於開放式集合 (如作業系統版本)。

將值加入到已經推出的列舉型別可能會破壞現有的程式碼;有時候可以接受這樣的處理,但是您不應該設計可能發生這種情況的列舉型別。

不要定義將保留到將來使用的列舉值。

在某些情況下,您可能會覺得將值加入到已推出的列舉型別值得冒著可能破壞現有程式碼的風險;您也可以定義新的列舉型別以及使用其值的成員。

不要在列舉型別中加入 Sentinel 值。

Sentinel 值是用來識別列舉型別中的值界限;Sentinel 值通常是用於範圍檢查,且它不是有效的資料值。下列程式碼範例將定義具有 Sentinel 值的列舉型別。

Public Enum Furniture

    Desk
    Chair
    Lamp
    Rug
    LastValue

End Enum

public enum Furniture
{
    Desk,
    Chair,
    Lamp,
    Rug,
    LastValue   // The sentinel value.
}

要在簡單列舉型別上提供零的值。

可能的話,將這個值命名為 None。如果 None 並不適合,請將零的值指派給最常用的值 (預設值)。

請考慮將 System.Int32 (多數程式設計語言中的預設資料型別) 當做列舉型別的基礎資料型別使用,除非下列任何一個條件成立:

  • 此列舉型別是旗標列舉型別,而且您有 32 個旗標以上,或是未來還希望有更多。

  • 基礎型別需要與 Int32 有所不同,才能與預期有不同大小的列舉型別之 Unmanaged 程式碼之間有更簡單的互通性。

  • 較小的基礎型別將會在空間上節省許多;如果您希望列舉型別主要是當做控制流程的引數使用,則大小將不會有什麼影響。但是在下列條件下,大小所節省的空間可能會相當可觀:

    • 您預期列舉型別要當做經常執行個體化的結構或類別中的欄位使用

    • 您預期使用者要建立大型陣列或列舉型別執行個體的集合

    • 您預期要序列化大量的列舉型別之執行個體

不要直接擴充 System.Enum。

某些編譯器不允許您擴充 Enum,除非您利用語言特定的關鍵字產生列舉型別,以間接方式來擴充。

Portions Copyright 2005 Microsoft Corporation.All rights reserved.

Portions Copyright Addison-Wesley Corporation.All rights reserved.

如需設計方針的詳細資訊,請參閱由 Krzysztof Cwalina 和 Brad Abrams 所著,並由 Addison-Wesley 於 2005 年發行的「Framework 設計方針:可重複使用之 .NET 程式庫的慣例、慣用語法和模式」一書。

請參閱

概念

設計旗標列舉型別

將值加入至列舉型別

其他資源

型別設計方針

開發類別庫的設計方針