'Enum:Type'与'Enum'之间的区别是什么?

时间:2012-12-12 14:32:27

标签: c# .net enums

我试图了解一般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,如果这很重要,我希望,这是一个更广泛的问题,不是我的环境特有的。

3 个答案:

答案 0 :(得分:13)

它规定了用于存储枚举的基础类型。

当您使用enum而没有任何其他内容时,它会使用int作为基础存储类型。

使用enum : <type>时,它会使用该类型作为基础存储类型。

在您的情况下,您尝试制作char类型的基础类型,但根据the C# reference,这是无效的:

  

枚举的已批准类型是byte,sbyte,short,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很好地填充了这个准则,完全不可变(如果你正确设计了它们,就像大多数系统值类型和其他值类型一样)。

答案 1 :(得分:2)

枚举的“基本类型”必须是整数值类型。字符串不符合条件,这是一种引用类型。

通常只有在与非托管代码互操作时才需要使用默认(int)。 C和C ++语言还允许使用相同的基类型指定枚举的大小。当你有很多[Flags]枚举值时,有一个很长的转角情况,允许你区分最多64个标志值。

如果您真的想要挤压存储要求,可以选择字节或短字。由于更好地使用cpu缓存,可以加速代码。由于类或结构中其他字段的对齐要求,这通常不会太好。当你操纵这样的枚举值时,你可能会失去缓存优势,比如测试它们的值或隔离一个标志,32位处理器真的像一个int,你将支付转换费用。分析是必需的。

答案 2 :(得分:0)

回答这个问题:

  

可能是一个愚蠢的问题,但为什么我不能只是作为一个字符串来回走。

您可以使用以下实现:

using System.ComponentModel;

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

所以基本上每个元素都会收到一些字符串值。

或者您可以使用struct:

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
}