const 和 static readonly看起来挺像的, 但它们还是有区别的, const值要在编译时就使用常量初始化, 不能在运行时修改, 而static readonly值可以在编译器动态初始化, 但初始化之后也不能修改. 这是它们的区别, 对于const值编译器会有一些优化, 但这些优化在某些情况下可能导致错误.
假如现在有两个工程, 其中有一个Class Library, 里面有个类:
而在另外一个Console Applicaton里引用了上面类中的const值:
编译运行程序, 控制台会输出 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中的值, 而无论它怎么更新.