当前位置: 代码迷 >> C# >> 枚举类型,作为一个门类,会有实例被创建出来吗
  详细解决方案

枚举类型,作为一个门类,会有实例被创建出来吗

热度:65   发布时间:2016-05-05 03:26:58.0
枚举类型,作为一个类型,会有实例被创建出来吗?
例如我有一个简单的枚举类型:

enum mye:
{
    e1,
    e2,
    e3
}

书上说,"枚举类型隐式的实例化为System.Enum类的结构"----也就是说,"类型"被实例化为"结构"。这句话怎么理解? 我以前的理解是,枚举类似于static类型,类本身没有实例,但在程序中可以用枚举定义的各个值。

所以我的问题是,程序运行的时候是否struct的实例称为mye(注意,不是e1,e2,e3,而是mye)? 
这个实例是全局的吗类似于一个static变量? 谁来创建System.Enum类的结构体,在什么时间创建,是程序本身编译时就决定了的,还是.net framework在运行时决定的?

我以前习惯用C语言,感觉C#的这个定义非常不同。还请指点,谢谢。
------解决思路----------------------
不是类似static
Enum是继承自System.ValueType也就是说 它是一个值类型。是分配在stack上,而不是managed heap上。

另外 下面来自msdn:https://msdn.microsoft.com/en-us/library/sbbt4032.aspx

Every enumeration type has an underlying type, which can be any integral type except char. The default underlying type of enumeration elements is int. 

意思是.net在保存Enum的时候是保存成它的underlying type --  int 除非你特别指定成别的整型类型。
To declare an enum of another integral type, such as byte, use a colon after the identifier followed by the type, as shown in the following example.
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

------解决思路----------------------
书上说的不一定是最正确的,一般情况下定义类型如果未指定父类型就是 Object,
这里的意思应该是定义枚举类型时默认的父类型是 Enum 类型。
既然有类型,那就有实例,这是肯定的,就是工厂的存在是为了生产产品。

------解决思路----------------------
引用:
枚举类型,作为一个类型,会有实例被创建出来吗?
...


会啊。
int i = 1234;    // i, 是一个值为1234, 类型为Int32的实例。
mye e = mye.e1;  // e, 是一个值为mye.e1, 类型为mye的实例。

int si = sizeof(int); // 每个Int32实例的大小为4个字节。
int se = sizeof(mye); // 每个mye实例的大小为4个字节。



------解决思路----------------------
在windows API中有很多用常量(宏)来定义一组参数值
而在面向对象的强类型语言里,则直接将其视作为一种类型。可以将枚举子理解为这个枚举类型的实例,只不过它们都是静态的。并且默认是当作int类型。未指定的第一项为零,后面的递增1
  相关解决方案