2009-11-25 82 views
1

枚举在.NET中如何工作? 例如。如何在.NET中使用枚举

Enum eOpenMode 
    Add = 1 
    Edit = 2 
End Enum 

If LOpenMode = eOpenMode.Add Then 
    rdoAddProject.Checked = True 
ElseIf LOpenMode = eOpenMode.Edit Then 
    rdoEditProject.Checked = True 

这是如何得到由他们的价值(1,2)或由其名称相比(添加,编辑)又会有怎样的内存分配方案?

回答

6

默认情况下,枚举基于Int32类型(尽管它们可以与其他基本数字类型一起使用),因此正在对整数值进行比较。

就值的内存表示而言,它应该与标准的Int32值相同。

+1

每当我想到.NET值类型,我:

除此之外,因为枚举被数字类型的支持,它们也可以用作位掩码允许值的组合最终在思考vtable和铸造时让自己困惑了几分钟。希望我得到的权利,虽然... – LorenVS 2009-11-25 12:37:41

4

枚举实际上只是整数 - (通常为int) - 并且完全相同。如果您有:

enum Mwahaha { 
    Evil = 1, Nasty = 1 
} 

然后您会发现Mwahaha.Evil == Mwahaha.Nasty。唯一倍名字有关系是:

  • 在你的代码
  • 使用时Enum.Parse(等)
  • 通过ToString()等(我怀疑EvilNasty是否上面显示这是不确定的)
  • 显示它时,
  • 使用像XML序列化(类似于以上)
+0

嗯... Mwahaha.Evil的整数值是1,同样Mwahaha.Nasty的值是2,那么它们如何可以相等,或者你指的是实际枚举的类型对象? – t0mm13b 2009-11-25 12:38:47

+0

因为我的手指训练有素,拒绝做愚蠢的事情!我已经推翻了他们,谢谢。 – 2009-11-25 12:39:17

+0

令人愉快的枚举让我微笑! :) – t0mm13b 2009-11-25 12:41:23

1

在C#中时,您可以使用一个枚举有两个目的:

  1. 要限制组可用值
  2. 的向这些价值观

提供有用的名称。如果你只有满足部分(2),你可以只使用常数。默认情况下,枚举的存储类型是Int32。这意味着==运算符比较整数。您可以通过显式指定基本类型(例如Int64或byte)来控制enum的基本类型。

+0

C#并没有真正限制这些值 - 它提供了广泛的指导,但您可以分配任何您喜欢的(正确大小的整数)值。 – 2009-11-25 12:41:52

+0

您可以覆盖枚举的类型,例如enum:byte {...}或者enum:short {...}等。 – t0mm13b 2009-11-25 12:49:19

3

枚举本质上是一个基本数字类型的薄层(默认为Int32)。在内部,它们的处理方式与数字值完全相同,并且可以随时对其基础类型进行转换。

因此,值得注意的是,在处理枚举时,您必须小心处理您传递的值。

Enum eOpenMode 
    Add = 1 
    Edit = 2 
End Enum 

Dim myEnumVal as eOpenMode 
myEnumVal = Cast(100, eOpenMode) 

此代码编译和运行良好和myEnumVal将包含值100,这是不映射到已知枚举值。然后,将此值传递给期望eOpenMode参数的方法对我来说是合法的,即使它不是枚举值之一。

如果提供的值未在枚举中定义,请务必使用Switch语句检查枚举值,并抛出ArgumentOutOfRangeException。总是

<Flags> 
Enum eOpenMode 
    Add = 1 
    Edit = 2 
    AddEdit = Add OR Edit 
End Enum 
+0

不错的答案,thx。 每个答案都有不同。 – 2009-11-25 14:46:02