2012-12-12 43 views
7

我想了解一些關於Enums的一般情況,以及他們如何使用Chars。下面是我的榜樣,我從工作:'枚舉:類型'和簡單'枚舉'之間的區別是什麼

public enum AuditInteractionTypes 
{ 
    Authorized = 'A', 
    Created = 'C', 
    Revised = 'R', 
    Extracted = 'E', 
    Deleted = 'D' 
} 

首先,什麼是宣佈他們enum AuditInteractionTypesenum AuditInteractionTypes : char之間的差別

第二,我已經看到了很多職位的約欲以Enumschars以及如何「使「它來回工作。可能愚蠢的問題,但爲什麼我不能簡單地來回string

因此,例如,Authorized = "A"

我有我正在使用Linq To SQL作爲我的DAL,如果這很重要,雖然我問,我希望,更廣泛的問題不是特定於我的環境。

+2

你要知道與基礎char類型的聲明枚舉在C#語言是非法的。 – vcsjones

+2

*從'char'派生*無效,但使用'char'文字表示每個項目的值爲:'enum Fruit:int { Apple ='A', Orange ='O', Banana ='B' }' –

+0

@AdamHouldsworth:爲什麼':int'部分?不理解。 –

回答

13

它規定了將用於存儲枚舉的基礎類型。

當您使用enum而沒有其他任何內容時,它將使用int作爲基礎存儲類型。

當您使用enum : <type>時,它將使用該類型作爲基礎存儲類型。

在你的情況,你正在努力使基礎類型char型的,但是這不是有效的,根據the C# reference

經批准的類型枚舉是字節,爲sbyte,短,USHORT ,int,uint,long或ulong。

如果你想存儲char值,那麼你有兩個選擇。

你可以使用一個基本類型的ushort(這是一個16位無符號整數像char),像這樣:

public enum AuditInteractionTypes : ushort 
{ 
    Authorized = 'A', 
    Created = 'C', 
    Revised = 'R', 
    Extracted = 'E', 
    Deleted = 'D' 
} 

char有一個隱式轉換爲ushort因此上述作品。此外,你可以輕鬆地比較兩者。

如果you want to use a string as the value那麼我建議一個enum狀類,如下所示:

public static class AuditInteractionTypes 
{ 
    // You can make these static readonly if they are likely to change. 
    public const string Authorized = "A"; 
    public const string Created = "C"; 
    public const string Revised = "R"; 
    public const string Extracted = "E"; 
    public const string Deleted = "D"; 
} 

這個類,然後幾乎看同一個enum和代碼相同的方式。

注意,同樣的技巧可以用任何類型完成,但通常這些類型應該是完全不可變的string很好地填充了這個指南,完全不可變(正如大多數系統值類型和其他值類型,如果你已經設計正確)。

+0

真的,爲什麼所有的帖子(像這裏 - > http://www.codeproject.com/Articles/78600/C-Enum-with-Char-Valued-Items),說明轉換方法來回轉換枚舉Char的?我錯過了什麼? –

+0

@RefractedPaladin在C#中聲明時,Char's在技術上不是枚舉的有效「基類型」,因此您在該文章中看到的是一種解決方法。 – vcsjones

+0

@RefractedPaladin - 如果您想從'char'枚舉的_value_中獲取一個字符串,則需要將數字值(這是一個「char」)轉換爲字符串表示形式。 – Oded

2

枚舉的「基本類型」必須是整型值類型。一個字符串沒有資格,這是一個引用類型。

不使用默認值(int)通常只在與非託管代碼互操作時才需要。 C和C++語言還允許使用相同的基本類型指定枚舉的大小。當你有很多[Flags]枚舉值時,長時間使用角落的情況下,可以讓你區分多達64個標誌值。

如果你真的試圖擠壓存儲需求,你可以選擇字節或短。由於更好地使用cpu緩存,可以加速代碼。由於類或結構中其他字段的對齊要求,通常情況下不會太好。當你操縱這樣的枚舉值時,你可能會失去緩存優勢,比如測試它們的值或者隔離一個標誌,32位處理器真的很像int,你會爲轉換付費。性能分析是必需的。

+0

操作中使用的大小(典型值爲32位)不必與存儲大小相匹配。這就是爲什麼你付錢。該段的本質。 –

0

回答這一個:

可能愚蠢的問題,但爲什麼不能我只是來回走爲字符串。

可以使用實現這樣的:

using System.ComponentModel; 

public enum AuditInteractionTypes 
{ 
    [Description("A")] Authorized, 
    [Description("C")] Created, 
    [Description("R")] Revised, 
    [Description("E")] Extracted, 
    [Description("D")] Deleted 
} 

所以基本上每一個元素會收到一些字符串值。

或者您可以使用結構:

struct AuditInteractionTypes 
{ 
    static string Authorized = "A"; 
    static string Created = "C"; 
    static int Revised = 0; 
    static char[] Extracted = "E".ToCharArray(); //Not sure if this one is usefull 
}