c#中的枚举类型

时间:2016-05-28 09:34:56

标签: c# memory-management enums reference value-type

当我们创建枚举类型的变量并为其赋予枚举值

enum Members{HighlyQualified, Qualified, Ordinary}
class
{
static void Main()
{
 Members developers = Members.HighlyQualified;
 Console.WriteLine(developers);//write out HighlyQualified
}
}

由于enum是值类型,因此开发人员的值存储在由Members.HighlyQualified返回的堆栈上。我们很清楚开发人员的值是字符串,它引用了字符的内存位置。

现在,

1.如果我们将Members.HighlyQualifed转换为int,则返回的值为0。 怎么回事?

2.对于枚举类型,什么值实际存储在堆栈上?

2 个答案:

答案 0 :(得分:10)

  

这里我们很清楚,开发人员的价值是字符串,它引用了字符的内存位置。

不,不是。 developers的值为Members类型。它由Console.WriteLine方法转换为字符串。您将调用Console.WriteLine(object)重载,其中包含值 - 然后Console.WriteLine将在该盒装值上调用ToString,并提供相应的枚举值名称。

  

如果我们将Members.HighlyQualifed转换为int,则返回的值为0.如何发生?

HighlyQualifiedMembers中声明的第一个成员,您尚未指定任何特定值。默认情况下,C#编译器将值0赋给第一个声明的值,然后每次递增1。如果您将Members.Qualified投射到int,则会得到1。

  

对于枚举类型,堆栈实际存储了什么值?

该值,有效只是一个数字。 (在这种情况下,int因为这是默认的底层类型。但堆栈槽的类型正确 - 枚举类型。

答案 1 :(得分:3)

的支持是否有任何差异

The documentation解释了基础类型:

  

默认情况下,枚举中每个元素的基础类型为int。

以及未明确指定时如何生成值:

  

如果未在枚举器列表中指定元素的值,则值将自动递增1.

因此,在您的情况下,声明等同于:

enum Members : int
{
    HighlyQualified = 0, 
    Qualified = 1, 
    Ordinary = 2
}

堆叠上的内容是enum类型本身(在这种情况下为Members),当您致电Console.WriteLine时,它会调用ToString,为此, per the docs for that,返回:

  

包含常量

名称的字符串