我试图了解一般Enums
的一些内容以及它们如何与Chars
具体合作。以下是我工作的例子:
public enum AuditInteractionTypes
{
Authorized = 'A',
Created = 'C',
Revised = 'R',
Extracted = 'E',
Deleted = 'D'
}
首先,声明它们enum AuditInteractionTypes
或enum AuditInteractionTypes : char
其次,我看过很多关于尝试将Enums
与chars
一起使用以及如何“让”它来回工作的帖子。可能是愚蠢的问题,但为什么我不能简单地以string
来回。
所以,例如,Authorized = "A"
。
我使用Linq To SQL作为我的DAL,如果这很重要,我希望,这是一个更广泛的问题,不是我的环境特有的。
答案 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
}