• 枚举与常量需要注意的一个问题


    .net中枚举其实就是数值型的常量,与const类似。当我们在代码中使用枚举代表的数值或者常量时,编译器其实是将该值直接写过来,而不会在运行的时候去读取该值。

    下面是一个例子:

    我们想建立一个类库项目,名称叫A,再建立一个控制台项目,名称叫Test,结构如下:

     

    A项目中的 MyClass.cs的代码:

        public class MyClass
        {
            public static string str1="str1";
    
            public const string str2="str2";
        }
    
        public enum MyEnum 
        { 
            One=1,
            Two=2,
            Three=3
        }
    

    定义了一个枚举以及一个静态字段、一个常量字段。

    Test项目引用A项目,代码如下:

        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工具反编译后的样子:

    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项目,那样运行结果还是不会变的。

    
  • 相关阅读:
    Git 基础教程 之 解决合并冲突
    Git 基础教程 之 远程库更新到本地
    Git 基础教程 之 分支管理及策略
    Git 基础教程 之 从远程库克隆
    Git 基础教程 之 添加远程仓库
    Git 基础教程 之 远程仓库
    c++11新特性1--------------auto
    线程及线程间同步
    进程间通信---信号
    进程间通信---mmap详解(与system V ipc通信对照)
  • 原文地址:https://www.cnblogs.com/jintianhu/p/1862583.html
Copyright © 2020-2023  润新知