zoukankan      html  css  js  c++  java
  • const 和 static readonly

    const 和 static readonly看起来挺像的, 但它们还是有区别的, const值要在编译时就使用常量初始化, 不能在运行时修改, 而static readonly值可以在编译器动态初始化, 但初始化之后也不能修改. 这是它们的区别, 对于const值编译器会有一些优化, 但这些优化在某些情况下可能导致错误.
    假如现在有两个工程, 其中有一个Class Library, 里面有个类:

    RefClass.cs

        public class RefClass

        {

            public const int MyInt = 5;

        }


    而在另外一个Console Applicaton里引用了上面类中的const值:
    Program.cs

        class Program

        {

            static void Main(string[] args)

            {

                Console.Write(RefClass.MyInt);

            }

        }


    编译运行程序, 控制台会输出 5.

    然后我们要更新Class Library工程, 把 MyInt 修改为 6, 然后单独生成Class Library(注意只生成这个工程, 而不是解决方案).

    再运行程序(到debug文件夹里去运行, 按ctrl+F5又要生成整个解决方案了...), 发现控制台输出的不是6, 还是5, 可那个 dll 文件里的 MyInt 已经改变了啊..

    原因就是const值在编译时已经被内联了, 反编译Program程序, 得到IL代码:

          L_0001: ldc.i4.5
          L_0002: call void [mscorlib]System.Console::Write(int32)

    ldc.i4.5 就是载入常量5, 它并没有引用另外一个dll里的值. 所以再更新带有const值的程序集后, 引用那个const值的程序集将无法使用到新的值.

    而用static readonly就不一样了. 还是上面的例子, 唯一的修改是把const 改为 static only 再反编译Programm, 得到的IL是:

        L_0001: ldsfld int32 [RefLib]RefLib.RefClass::MyInt
        L_0006: call void [mscorlib]System.Console::Write(int32)

    所以使用static readonly后, 程序将可以引用dll中的值, 而无论它怎么更新.
  • 相关阅读:
    linux-kernel邮件列表订阅出错,提示命令不能识别---解决方案
    MD5(单向散列算法)原理分析
    win32汇编跳转指令用法
    (转载)c/c++优先级列表
    linux man手册各个章节的意义
    如何解决dpkg: error processing install-info
    python魔法函数(常见)
    redis 哈希封装
    数据库去重
    抖音破解字体加密
  • 原文地址:https://www.cnblogs.com/Dah/p/542648.html
Copyright © 2011-2022 走看看