2009-07-22 167 views
54

我有這是一個枚舉屬性類枚舉初值

枚舉是

/// <summary> 
/// All available delivery actions 
/// </summary> 
public enum EnumDeliveryAction 
    { 
    /// <summary> 
    /// Tasks with email delivery action will be emailed 
    /// </summary> 
    Email, 

    /// <summary> 
    /// Tasks with SharePoint delivery action 
    /// </summary> 
    SharePoint 
    } 

當我在代碼中創建這個類的一個實例,NOWHERE,我指定enum字段的值,但它似乎默認爲enumlist中的第一個項目,而不是空值,這是枚舉的工作方式?如何確保枚舉獲取某種空值(如果未設置),我不希望它默認爲枚舉中的第一個值。

+0

ENUM是一個值類型,而不是一個引用類型。引用類型默認爲null,而值類型默認爲一個值。即int默認爲0,日期時間默認爲最小日期,等等。 – contactmatt 2012-02-24 17:20:14

回答

103

enum類型的默認值爲0(默認情況下,它是枚舉中的第一個元素)。一個類的字段將被初始化爲默認值。

如果需要表示在枚舉的未知值,可以用值0添加元素Unknown或者,可以聲明字段作爲Nullable<MyEnum>MyEnum?)。

+0

那麼我需要用1開始我的枚舉第一個值嗎? – 2009-07-22 13:51:40

+0

更新了答案以反映這一點。 – 2009-07-22 13:53:55

+1

除非你想默認值是undefined ..它仍然默認值爲零,如果你的枚舉沒有值爲零的成員,將是一個非法值。 – 2009-07-22 13:54:35

8

枚舉是一個值類型,如整數。您需要使其可以爲空,以便不默認第一個(或0定義的)枚舉成員。

public class MyClass 
{ 
    public EnumDeliveryAction? DeliveryAction { get; set;} 
} 
7

枚舉字段初始化爲零;如果您沒有在枚舉中指定值,則它們從零開始(Email = 0,SharePoint=1等)。

因此,默認情況下,您自行初始化的任何字段將爲Email。對於這種情況,添加None=0比較常見,或者使用Nullable<T>;即

/// <summary> 
/// All available delivery actions 
/// </summary> 
public enum EnumDeliveryAction 
{ 
    /// <summary> 
    /// Not specified 
    /// </summary> 
    None, 

    /// <summary> 
    /// Tasks with email delivery action will be emailed 
    /// </summary> 
    Email, 

    /// <summary> 
    /// Tasks with SharePoint delivery action 
    /// </summary> 
    SharePoint 
} 

你也應該確保永遠不會把你的最後預計值作爲默認值;即

switch(action) { 
    case EnumDeliveryAction.Email; RunEmail(); break; 
    default: RunSharePoint(); break; 
} 

這應該是:

switch(action) { 
    case EnumDeliveryAction.Email; RunEmail(); break; 
    case EnumDeliveryAction.SharePoint; RunSharePoint(); break; 
    default: throw new InvalidOperationException(
      "Unexpected action: " + action); 
} 
0

傳統的形式給出,以添加空到不一般有一個是聲明的變量可空類型值,即:

EnumDeliveryAction? action=null; 
0

我建議將值None = 0作爲您的第一枚枚舉值。明確地說,那麼你肯定知道它的價值是什麼。

1

您可以以任何值(例如1)開始枚舉,但當它們代表數據庫中的查找值時,通常希望它們匹配。

根據.Net框架設計指導原則,我通常將第一個Enum聲明爲None(= 0)。

6

最佳實踐(根據代碼分析的建議)應始終在您的枚舉中有一個默認值,它表示未設置的值。

所以你的情況,你可能有:

public enum EnumDeliveryAction 
    { 

    /// <summary> 
    /// Default value 
    /// </summary> 
    NotSet, 

    /// <summary> 
    /// Tasks with email delivery action will be emailed 
    /// </summary> 
    Email, 

    /// <summary> 
    /// Tasks with SharePoint delivery action 
    /// </summary> 
    SharePoint 
    } 

順便說一句,你不應該前綴枚舉枚舉的名稱。您可能會考慮更改爲:

public enum DeliveryAction; 
0

默認情況下,只有引用類型是可爲空的類型。如果你想要一個變量來允許空值,你必須使用「?」來將其定義爲空值。字符(爲此,您需要C#2.0或更高版本)。

enum MyEnum 
{ 
    ValueOne, 
    ValueTwo 
} 

和類

MyEnum? myvariable = null; 
3

枚舉是值類型。值類型不能爲空,初始化爲0

即使你的枚舉沒有一個0,枚舉變量將被初始化爲0

public enum SomeEnum 
{ 
    A = 1, 
    B = 2 
} 

(後下)

SomeEnum x = default(SomeEnum); 
Console.WriteLine(x); 

輸出 - 0


一些應答者使用Nullable<T>以符合您我主張硝化期望。由於Nullable<T>仍然是一種值類型,並且與引用類型具有不同的語義,因此可以採用這種建議。例如,它永遠不會生成空引用異常(它不是引用)。

SomeEnum? x = default(SomeEnum?); 

if (x == null) 
{ 
    Console.WriteLine("It's null!"); 
} 
if (x > SomeEnum.B) 
{ 
} 
else 
{ 
    Console.WriteLine("This runs even though you don't expect it to"); 
} 
0

我的C++老師在大學(11年前)告訴我,連接器替換枚舉與他們的實際類型:

typedef static const int enum;

因此,你喜歡寫東西enum MY_VAL = 5;,你可以在任何時間很容易替換爲static const int MY_VAL = 5;(但這只是讓你的代碼更長......)。

無論如何,任何int的默認值爲0。