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中的值, 而无论它怎么更新.
  • 相关阅读:
    OEM中无法用sys用户登录
    intra blcok chain(转)
    _b_tree_bitmap_plans的一次使用
    内存之私有sql区和共享sql区
    UNIX环境C语言信号
    UNIX环境C语言进程管理、进程间通信
    【转】显示JavaScript函数调用堆栈的方法
    【转】Java内存溢出(java.lang.OutOfMemoryError)问题及其解决方法
    JavaScript日期格式化方法
    Maven导入本地Jar总结
  • 原文地址:https://www.cnblogs.com/Dah/p/542648.html
Copyright © 2011-2022 走看看