簡體   English   中英

枚舉應該具有未初始化的值。

[英]Should enums have uninitialized values .

如果枚舉應該具有未初始化的值,我們就會進行辯論。 例如。 我們有

public enum TimeOfDayType
{
   Morning
   Afternoon
   Evening
}

要么

public enum TimeOfDayType
{
   None
   Morning
   Afternoon
   Evening
}

我認為不應該沒有,但是你必須在初始化時默認為某個有效值。 但是其他人認為應該通過另一個枚舉為None或NotSet來表示單一狀態。

想法?

說到可空類型 - 我認為它們可以用來解決強制/不強制枚舉初始化的問題。 說我們有

enum Color { Red, Blue }

讓我們說你有一個功能:

void Draw(Color c);

該函數表示它需要有效的Color 但是,我們也可以有這個功能:

void Draw(Color? c);

這表示該函數可以處理不傳遞顏色(將傳遞null以指示“不關心”)。

嗯,它是None成員的一種替代方案。

我總是將我的一個枚舉文字設置為零。 此文字不能總是命名為“None”或“NotSet”。 這取決於是否有一個文字作為默認行為。

我將1設置為零,因為枚舉(除了可以為空的枚舉)總是由內存中的CLR初始化為零。 如果您沒有定義其中一個文字,則此內存包含非法值。 當你使用枚舉作為標志時。 默認值不能用於執行按位compairisons。 結果將始終為零。

啟用FxCop時,它會檢查您是否已將文字定義為默認值。 當他們有規則時,似乎是一個“好習慣”。

在以前的一些答案中,提出了一個可以為空的枚舉作為解決方案。 但是可以為空的枚舉的缺點是它使客戶端每次使用枚舉時都會檢查空值。 相反,如果您有一個默認值“None”,您可以選擇使用switch作為有意義的值,只需忽略“None”,而不必擔心enum變量可能為null。

無論如何,我認為只有在枚舉被用作某個類的默認構造函數中的參數時,使用默認值“None”或使枚舉可為空才有意義。 你必須問自己 - 該類的對象是否應該有一些有意義的默認值? 將您的示例與TimeOfDayType枚舉一起使用 - 如果使用TimeOfDayType.None初始化對象,則在將值更改為Morning,Afternoon或Evening之前,無論如何都無法使用它。 所以你不能說默認是早晨而不是沒有嗎? 或者 - 哪個更好 - 在你已經知道他們需要哪個枚舉值之后,你不能創建你的對象嗎? 我認為如果在早期設計階段正確處理問題,您根本不需要為您的枚舉設置特殊的默認值。

當然,以上所有都是概括性的。 也許它無法應用於您的特定場景,因此如果您提供一些有關它的詳細信息,我們可以更徹底地討論該問題。

在“默認”成員的絕對中,我認為有一個表示文字int 0的值是很有價值的。

無論如何,將使用字面值0創建給定的枚舉。這里最直接的情況是作為結構的成員。 AC#struct將始終具有一個空的默認構造函數,將所有字段初始化為其默認值。 在枚舉的情況下,這將是字面值0.問題是如何處理它。

對我來說,這是一個樣式問題:如果枚舉沒有顯式初始化為一個值,它應該被賦予一個任意有效值或一個特定的值,表明缺乏顯式初始化?

enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
  Color color;
}

static void SomeMethod() {
  var v1 = new Example<Color>();
  var v2 = new Example<Color2>();
}

在v1的情況下,如果檢查顏色字段,則將明確標記為未初始化的字段。 在v2中,字段將簡單地為“紅色”。 程序員無法在顯式設置為“紅色”或隱式默認值為“紅色”之間進行檢測。

導致問題的另一種情況是針對枚舉值執行switch語句。 讓我們輕輕地改變Color2的定義。

enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
  switch ( p1.color ) {
   case Color.Red: {} 
   case Color.Blue: {}
   default: {throw new Exception("What happened?"); }
  }
}

該開關處理枚舉中的每個顯式值。 然而,對於Example <Color2>的默認構造函數,此代碼將失敗,並且無法抑制此構造函數。

這提出了一個更為重要的規則:為字面值0設置顯式枚舉值。

只是添加到Franks的回答中,我唯一一次選擇枚舉中的“無”項目是否可以為nullable是將枚舉用作標記。 “無”項目的ID為0。

取決於類型的使用方式。 對於該類型的用戶來說,通常更容易沒有“未定義”值,因為您不需要特殊情況下的一個值。 但是如果你需要一個(因為值有時需要處於一個不是任何枚舉值的狀態),那么你需要一個。 您通常不使用兩個枚舉而不是一個枚舉來保存任何特殊情況代碼。

這有點像是否應該使用可空類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM