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中的值, 而无论它怎么更新.
原文地址:https://www.cnblogs.com/Dah/p/542648.html