C# 有人能用图表说明枚举是如何存储在内存中的吗?

C# 有人能用图表说明枚举是如何存储在内存中的吗?,c#,memory,C#,Memory,枚举数据类型如何存储在内存中?枚举是否真的存储在堆栈的内存中?如何访问枚举的每个值 我读过很多博客,说枚举不存储在堆栈中。它们不需要内存来存储?枚举是对编译器推断的数字数据类型的解释(通常是整数,但您可以更改它) 编译器为您定义的每个枚举引入一个新类型。新定义的类型是特定的,因为您不能从继承,并且包含可以用于从中强制转换的运算符和整型 从内存角度来看,枚举存储在一个整型值中,该值能够包含您声明的所有值 CLR将其作为基本服务提供,因此像c#这样的语言具有这种行为。这可能不是每个人的规则。Net支

枚举数据类型如何存储在内存中?枚举是否真的存储在堆栈的内存中?如何访问枚举的每个值


我读过很多博客,说枚举不存储在堆栈中。它们不需要内存来存储?

枚举是对编译器推断的数字数据类型的解释(通常是整数,但您可以更改它)

编译器为您定义的每个枚举引入一个新类型。新定义的类型是特定的,因为您不能从继承,并且包含可以用于从中强制转换的运算符和整型

从内存角度来看,枚举存储在一个整型值中,该值能够包含您声明的所有值

CLR将其作为基本服务提供,因此像c#这样的语言具有这种行为。这可能不是每个人的规则。Net支持的语言

由于枚举类型作为整型处理,它们存储在堆栈中,并作为各自的数据类型注册:标准枚举通常作为int32实现;这意味着编译器将把枚举作为int32的同义词来处理(为了简单起见,我省略了几个细节)。因此,您的枚举最后是一个int32

如果要控制枚举的实现方式,可以通过以下方式声明:

enum MyEnum: byte{}

在上面的示例中,MyEnum是一个字节,因此编译器将它作为一个字节处理

枚举不在内存中分配-它们只存在于编译阶段。它们的存在只是为了告诉编译器在我们的示例中的值是多少。当代码运行时,那里不再有枚举

它的作用与下面相同

#define Monday 0;
#define Tuesday 1;
.
.
.
.
#define Sunday 6;
但是我们更喜欢使用enum而不是define,因为使用enum比使用#defines更容易支持和读取代码


通过此

可以清楚地显示枚举大小。枚举是存储常量。
一旦为枚举创建了值列表,这些值将作为文本存储在其显示名(声明枚举时给出的访问名)中。 适合储存。
检查ILDASM工具以签出IL代码中的枚举文字。

与int完全相同。没有区别。如果我们有
enum Name:[type=int]{*}
Name x
-如果重新生成的大小正好为
type
,默认情况下为
int
,并且可以基于
Name x
的位置存储在任何位置。如果它声明为局部变量-将存储在堆栈中这对.Net平台是真的吗..是的,它是真的。枚举是以块的形式存储在堆栈中还是作为单独的实体单独存储。如果这些单独存储,它们是如何访问的?枚举是如何存储在堆栈中的?我编辑了答案以包括您看到的内容。如果您需要更多信息,请告诉我。枚举是以块的形式存储在堆栈中,还是作为单个实体单独存储。如果这些单独存储,如何访问它们?枚举可以采用的值,例如A、B和C,会转换为0、1和2等整数。枚举本身确实是一个整数。整数以4字节的形式放置在堆栈中,按平台要求对齐。不存储任何实体,因为只存储值。如果您使用的是位字段,则位字段允许32或64个最大值,并且每个值都转换为2的幂。您的解释对我很有帮助。谢谢!!