【问题标题】:What's the difference between 'Enum : Type' and simply 'Enum'“枚举:类型”和简单的“枚举”有什么区别
【发布时间】:2012-12-12 14:32:26
【问题描述】:

我试图了解一些关于 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,但我希望这是一个不特定于我的环境的更广泛级别的问题。

【问题讨论】:

  • 请注意,在 C# 语言中使用 char 基类型声明枚举是非法的。
  • Deriving from char 无效,但使用 char 文字来表示每个项目的值是:enum Fruit : int { Apple = 'A', Orange = 'O', Banana = 'B' }
  • @AdamHouldsworth:那为什么是 `:int` 部分呢?不明白。
  • @RefractedPaladin 这只是存储枚举的底层数据类型。char 可以用于枚举数据类型隐式转换为char 的情况。
  • 次要吹毛求疵:命名指南规定您的枚举应命名为AuditInteractionType;仅当 FlagAttribute 应用于枚举时才使用复数形式。

标签: c# .net enums


【解决方案1】:

它规定了将用于存储枚举的底层类型。

当您使用enum 而不使用其他任何东西时,它使用int 作为底层存储类型。

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

根据the C# reference,您正在尝试创建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,因此上述方法有效。此外,您可以轻松地比较两者。

如果是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 很好地满足了这一准则,它是完全不可变的(大多数系统值类型和其他值类型也是如此,如果你设计正确的话)。

【讨论】:

  • 真的,那么为什么所有的帖子(比如这里-->codeproject.com/Articles/78600/C-Enum-with-Char-Valued-Items)都说明了 Enums Char 的来回转换方法?我错过了什么?
  • @RefractedPaladin Char 在 C# 中声明时在技术上不是有效的枚举“基类型”,因此您在该文章中看到的是一种解决方法。
  • @RefractedPaladin - 如果要从char 枚举的 中获取字符串,则需要将数值转换(即char is) 到字符串表示形式。
  • 我明白了,在这里谈论可能纯粹是无知,但使用值为StringChar 的枚举更简单吗?
  • 从您发布的链接中:关键发现是从枚举到 char 的转换,您需要先将其转换为 char,然后才能获得您的 char 值,因为由于 .NET框架认为它是一个 int,你必须将它转换为 char(因此它会将 int 转换为 ASCII 表上的等效 char,就像旧方法 chr())。
【解决方案2】:

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

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

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

【讨论】:

  • 操作中使用的大小(典型 32 位)不必与存储大小匹配。这就是为什么你要付钱。段落的精髓。
【解决方案3】:

回答这个问题:

可能是个愚蠢的问题,但为什么我不能简单地以字符串的形式来回切换。

你可以像这样使用实现:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2018-09-25
    • 2013-10-27
    • 2011-03-19
    • 2016-01-02
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多