2017-06-02 122 views
2

我正在使用Model,並使用enum獲取已命名項目的列表。Enum適用於此?

class Verse 
{ 
    public int Number { get; set; } 
    public string Text { get; set; } 
} 
class Chapter 
{ 
    public int Number { get; set; } 
    public List<Verse> Verses { get; set; } 
} 
class Book 
{ 
    public string Name { get; set; } 
    public List<Chapter> Chapters { get; set; } 
} 
class Bible 
{ 
    public Versions Version { get; set; } 
    public List<Book> Books { get; set; } 
} 

enum Versions 
{ 
    asv1901, 
    bbe, 
    darby, 
    kjv, 
    nasb, 
    niv, 
    nkjv, 
    nlt, 
    rsv, 
    web, 
    ylt 
} 

這似乎是做一個合乎邏輯的方式,但我發現,與enum工作時增加不必要的困難。

foreach (var chapter in chapters) 
{ 
    var bibleitem = new Bible(); 
    bibleitem.Version = (Versions)Enum.Parse(typeof(Versions), chapter.version); 
} 

會更有意義只使用string[]什麼?我確信enum有一些額外的好處,但我質疑我的好處。

+0

什麼類型是你的'chapters'收藏? –

+0

'enum'比較'string'比較效率更高,enums用於編碼的清晰度。幫助你快速理解你的代碼。 – Media

+0

您可以改爲使用通用['TryParse'](https://msdn.microsoft.com/en-us/library/dd783499(v = vs.110).aspx)。 '版本ver; Enum.TryParse(chapter.version,out ver); bibleitem.Version = ver;' – juharr

回答

1

如果在代碼中有一個常量的命名列表,並且您知道此特定列表不會隨時間變化(因此稱爲常量名稱列表),您應該使用枚舉。

你有什麼好處? 可讀性。使用枚舉可以提高代碼的可讀性。考慮我有兩種僱員類型的情況:永久和ContractBased。現在我可以在我的代碼做到這一點是這樣的:

if employee.Type == 1 
    // deal with permanent employee 
else if employee.Type == 2 
    // deal with contract based employee here 

這樣的代碼難以閱讀和維護,因爲沒有人能猜出是什麼employee.Type == 1或者是什麼employee.Type == 2種手段。

如果我定義枚舉代替這樣的: 枚舉EmployeeType {常駐= 1,ContractBased = 2}

我的代碼變成這樣:

if employee.Type == EmployeeType.Permanent 
    // deal with permanent employee 
else if employee.Type == EmployeeType.ContractBased 
    // deal with contract based employee here 

代碼的可讀性被最大化,並且也我有intellisense可用。

與字符串的問題: 1)你最終會在你的代碼 2)沒有智能感知 3)更多的內存消耗

如何應對增加的複雜性硬編碼字符串文字? 你應該有一個枚舉類型變量chapter.Version(現在缺少)而不是int。這樣你就不需要做解析。

+0

不幸的是,chapter.version是以字符串形式出現的(JSON API結果),我想要做的是理論上,字符串結果只能匹配其中一個規定的選項,當然,這可能是我正在查看所有這些不正確的(我只是一個業餘愛好者編碼器)。什麼看起來是正確的和t讓這一切工作。 Hehehe ... – doubleJ

0
but I'm finding that working with enum is adding unnecessary difficulty. 

這取決於你的需求。如果你的集合不會改變枚舉是最好的方法,因爲它增加了一個更詳細的控制和一個有限的集合,當你與同一個項目的許多開發人員一起工作時,這個集合是無法繞過的。

,如果你的集合可以解決方案的開發過程中改變,你不能預覽設定不是字符串將是更好的方式去

0

枚舉平時工作時最好:

  1. 沒有一個增加或很快刪除記錄,它(希望永遠不會)。
  2. 您不需要使用枚舉記錄背後的實際值。
  3. 您不需要使用記錄的名稱。

Enum.Parse可以用來獲得從string枚舉的紀錄,但因爲你注意到它是相當醜陋,我不鼓勵你使用它。如果你有積分枚舉值,你可以簡單地進行投這樣的:

Versions version = (Versions)0; 

但是請注意,枚舉不存在保證是int型的,也可以是任何其他整數值。 int恰好是默認值。我不但是也可以從依靠枚舉真實的積分值勸阻你,因爲這樣的事情也是可能的:

public enum Versions 
{ 
    One = 1, 
    Two = 2, 
    Three = 3 
} 

public void Do() 
{ 
    Versions version = (Version)-9; 
    // version is now Versions.One. 
    // Its value however is -9, what kind of version should -9 be? 
} 

上面的代碼沒有錯誤運行,因爲運行時不會對您正在使用的值進行任何檢查爲演員。

的回答你的問題取決於Versions性質。如果你相信它將來不會改變,那麼在大多數情況下它是一個很好的枚舉類型。但是你應該在整個應用程序中使用枚舉。我在您的示例中看到,您將該版本用作string,因此需要執行一個醜陋的Enum.Parse。使用枚舉時,一致性是一個重要的因素,它總是如此,但是再次指出它並沒有什麼壞處。

如果您認爲您的記錄具有更多動態性質,那麼您可能最適合使用string s。在這種情況下,您應該始終使用string。 (只是想指出來再次)

+0

'chapter.version'作爲來自JSON API的'string'。我想我可以使用'switch'(使用數字),但這似乎增加了更多的複雜性。 – doubleJ

+0

@doubleJ如果你認爲你的版本永遠不會改變,你可以用'Enum.Parse'(更好地使用'Enum.TryParse')將你的json字符串映射到enum,但是一旦json進入並存儲枚舉實例的json字符串。但正如其他人指出的,你的'版本'可能是變化的主題,這並不適合使用枚舉。 –

7

從微軟的指南是在這裏:

https://msdn.microsoft.com/en-us/library/ms229058%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396

特別注意到:不要使用枚舉開集

人寫新的聖經,所以你的一組枚舉值可能會改變。例如,你可以更好地使用字符串常量,你可以隨意添加更多字符串常量。

雖然我們對它有一些額外的批評。

class Verse 
{ 
    public int Number { get; set; } 
    public string Text { get; set; } 
} 

爲什麼這是一個一流的,爲什麼是屬性設定?你是否設想過現有的詩歌,並希望將其數量和文字改爲不同的東西?如果不是,那麼不要允許它。我會這樣寫

struct Verse 
{ 
    public int Number { get; private set; } 
    public string Text { get; private set; } 
    public Verse(int number, string text) : this() 
    { 
     this.Number = number; 
     this.Text = text; 
    } 
} 

一旦它被創建,它不會改變。此外,這是一個小的不可變的東西,在邏輯上是一個值,所以使它成爲一個結構。

class Chapter 
{ 
    public int Number { get; set; } 
    public List<Verse> Verses { get; set; } 
} 

再次,如果你有一個現有的章節,你是否打算修改一組經文?因爲任何人都可以在名單上撥打Add。此外,這限制你到,並且在任何時候都可以使用該列表,而不是從數據庫中懶洋洋地計算出來。做這個IEnumerable<Verse>

enum Versions 
{ 
    asv1901, 
    bbe, 

這違反了命名準則和一般易讀性。拼寫出來! AmericanStandardVersion1901遠遠好於asv1901

+0

該死的 - 埃裏克在這裏,我的回答註定不會被人注意:P嗯,爲什麼你要給默認的ctor增加一個手動呼叫? –

+1

@NoelWidmer:因爲在以前的C#版本中,它是必需的,現在它始終在我的手指上。 :-) –

+0

不知道! VS有這個格式化規則來自動爲'this.'前綴成員訪問,你也是這樣做的。這有什麼好處?僅僅是爲了可讀性,還是從舊時代的習慣。 –

0

使用枚舉提供了用於比較此類實例的方法,將實例的值轉換爲其字符串表示形式,將數字的字符串表示形式轉換爲此類的實例,並創建指定枚舉的實例,以及值。

正確使用im類。

Exp。

public enum Versions 
{   
    asv1901, 
    bbe, 
    darby, 
    kjv, 
    nasb, 
    niv, 
    nkjv, 
    nlt, 
    rsv, 
    web, 
    ylt 
} 

接下來,實施

foreach (var chapter in chapters) 
{ 
    var bibleitem = new Bible(); 
    bibleitem.Version = (Versions) "Your class enum"(typeof(Versions), chapter.version); 
} 

枚舉多用於良好的編程習慣,乾淨的代碼

Referency使用枚舉:Enum Class Microsoft