枚举与常量需要注意的一个问题
.net中枚举其实就是数值型的常量,与const类似。当我们在代码中使用枚举代表的数值或者常量时,编译器其实是将该值直接写过来,而不会在运行的时候去读取该值。
下面是一个例子:
我们想建立一个类库项目,名称叫A,再建立一个控制台项目,名称叫Test,结构如下:
A项目中的 MyClass.cs的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class MyClass { public static string str1= "str1" ; public const string str2= "str2" ; } public enum MyEnum { One=1, Two=2, Three=3 } |
定义了一个枚举以及一个静态字段、一个常量字段。
Test项目引用A项目,代码如下:
1 2 3 4 5 6 7 8 9 10 11 | class Program { static void Main( string [] args) { Console.WriteLine(( int )MyEnum.One); Console.WriteLine(MyEnum.One.ToString()); Console.WriteLine(MyClass.str1); Console.WriteLine(MyClass.str2); } } |
我们来看看Program类用Reflector工具反编译后的样子:
1 2 3 4 5 6 7 | private static void Main( string [] args) { Console.WriteLine(1); Console.WriteLine(MyEnum.One.ToString()); Console.WriteLine(MyClass.str1); Console.WriteLine( "str2" ); } |
编译器将(int)MyEnum.One的值与常量字段str2直接硬编码写到代码中,而不是在运行期再去读取。
这样处理的后果是:如果你修改了A项目中的枚举的排列顺序或者枚举对应的值(或者改变了常量字段str2的值),比如将MyEnum.One的值2,同时不重新编译Test项目,那样运行结果还是不会变的。
我的网站:http://i.goto327.top:85/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构