7

我试图了解一些关于Enums一般情况的事情以及它们如何Chars具体工作。以下是我正在使用的示例:

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

enum AuditInteractionTypes首先,声明它们或声明它们有什么区别enum AuditInteractionTypes : char

其次,我看过许多关于尝试使用Enumswithchars以及如何“使”它来回工作的帖子。可能是愚蠢的问题,但为什么我不能简单地以string.

所以,例如,Authorized = "A"

如果这很重要,我已经使用 Linq To SQL 作为我的 DAL,尽管我希望这是一个不特定于我的环境的更广泛级别的问题。

4

3 回答 3

13

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

当您不使用enum任何其他内容时,它使用 anint作为底层存储类型。

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

根据C# 参考,在您的情况下,您正在尝试创建 type 的基础类型char,但这是无效的:

已批准的枚举类型为 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所以上述工作。此外,您可以轻松地比较两者。

如果您想使用字符串作为值,那么我会推荐一个enum-like 类,如下所示:

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";
}

然后,这个类看起来几乎与 an 相同,enum并且以相同的方式编码。

请注意,任何类型都可以使用相同的技巧,但通常这些类型应该是完全不可变的。 string很好地满足了这个准则,完全不可变(大多数系统值类型和其他值类型也是如此,如果你设计正确的话)。

于 2012-12-12T14:34:26.237 回答
2

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

仅当您与非托管代码进行互操作时,通常才需要不使用默认值 (int)。C 和 C++ 语言还允许使用相同的基本类型指定枚举的大小。当您有很多 [Flags] 枚举值时,使用 long 的极端情况很有用,允许您区分多达 64 个标志值。

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

于 2012-12-12T14:47:07.857 回答
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
}
于 2017-08-07T22:54:46.063 回答