You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#枚举成员的类型与枚举本身相同?

C#枚举内部实现与成员本质解析

一、枚举成员的类型本质

枚举在C#中是值类型,本质是对基础数值类型(默认是int)的强类型封装。你接触到的NflTeams.Raiders并不是单例类的实例属性,它本身就是NflTeams类型的一个值——底层存储的是对应的整数值,但编译器为它赋予了枚举类型的身份,核心目的是保证类型安全,避免随意传入不匹配的数值。

比如定义如下枚举:

enum NflTeams { Raiders = 1, Chiefs = 2 }

NflTeams.Raiders在运行时就是一个存储着1的NflTeams类型值,它和普通int值1属于不同类型,但可以通过显式转换互相转换。

二、传递枚举成员的行为

由于枚举是值类型,传递枚举成员的逻辑和int、bool等值类型完全一致:传递的是值的副本。当你把NflTeams.Raiders传入方法时,方法接收的是这个枚举值的拷贝,修改方法内的枚举变量不会影响外部原变量。

三、ValuesAndNames类的作用

你看到的ValuesAndNames是.NET框架用于缓存枚举元数据的内部类,它会将枚举的所有成员名称和对应数值分别存入数组,当调用Enum.GetNames()或Enum.GetValues()这类方法时,会直接从这个缓存中读取数据,避免每次都通过反射解析元数据,以此提升性能。但这个类仅负责元数据的存储,和单个枚举成员的使用逻辑无关——单个成员就是一个普通的枚举类型值,只是元数据里记录了它的名称与对应数值的映射关系。

四、反编译无法查看枚举成员定义的原因

枚举成员在编译后并不会以类的属性或字段形式存在,而是被编译器转换成常量值嵌入到引用它的代码中。反编译工具看到的NflTeams.Raiders,本质是编译器替换后的数值,因此右键查看定义时,只能定位到整个枚举的定义处,无法看到单独的成员“源码”——因为编译后根本不存在单独的成员实体,只有元数据中留存的映射记录。

内容的提问来源于stack exchange,提问作者TakingTheHobbitsToIsengard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:06:02