美文网首页
Effective C#笔记 - 考虑用readonly代替co

Effective C#笔记 - 考虑用readonly代替co

作者: Francis_Rose | 来源:发表于2019-12-11 20:41 被阅读0次

    很多时候在使用readonly和const来指定常量的时候,并没有很细的去区分它们的区别,反而更多的时候是根据编译器指定的方式来使用。const是编译期的常量,而readonly是运行期的常量,编译期常量在编译成IL后直接用指定的常量字面值替换相关代码,因此使用会简单,效率也会高一些。readonly的常量在代码生成的IL会通过引用来使用该常量。两者的差别也带来了使用上的差异,const修饰的常量,即编译期常量只能支持内置的整数、浮点数、枚举和字符串等类型,因为需要在编译期就去使用字面值替换,所以不能支持自定义类型数据,readonly则可以。即便DateTime是值类型,也会出现编译错误。

    public class MyClass
    {
        // compile-time constant
        public const int MaxCount = 50;
    
        // runtime constant
        public static readonly int ThisYear = 2019;
    
        // Does not compile, use readonly instead
        private const DateTime createTime = new DateTime(2019, 1, 1, 0, 0, 0);
    }
    

    两者的区别:
    1. 编译期常量只能用数字、字符串或null来初始化,而运行期常量则是在执行完构造函数之后就不能修改,也就是说运行期常量是在程序运行的时候初始化的。因此运行期常量要相对灵活一些,且使用类型不受限制。
    2. readonly可以用来声明实例级别的常量,以便给同一个类的每个实例设定不同的常量值,而编译期常量是静态常量。
    3. readonly常量在程序运行时才加以解析,也就是说,如果代码使用了运行期常量,这段代码生成的IL代码会通过引用的方式使用readonly常量而不是常量自身。这样就使得使用时有更多的消耗来支持。

    所以在使用的时候,需要明确使用的目的:如果常量不需要随版本改变,比如数学常量π,取值固定,或者必须在编译期确定的常量,如switch case语句的标签,亦或性能极端重要才会考虑用const,即编译期常量,否则,应当优先考虑使用readonly即运行期常量。

    相关文章

      网友评论

          本文标题:Effective C#笔记 - 考虑用readonly代替co

          本文链接:https://www.haomeiwen.com/subject/scmagctx.html