zoukankan      html  css  js  c++  java
  • c# 优化代码的一些规则——const 和 readonly[二]

    前言

    在c# 的世界中,在初学的时候,可能很难区分readonly 和 const,两者都是不可修改。

    看到这两个单词,我们想的是,最多他们的区别也不会太大。然后事实却出乎我们的意料。

    正文

    这两个声明变量根本是不同时期的变量。

    readonly 是 运行时常量,而const 是编译的时候的变量。

    对于常量,C#里有两个不同的版本:运行时常量和编译时常量。

    因为他们有不同的表现行为,所以当你使用不当时,将会损伤程序性能或者出现错误。

    两害相权取其轻,当我们不得不选择一个的时候,我们宁可选择一个运行慢一点但正确的那一个,而不是运行快一点但有错误的那个。

    基于这个理由,你应该选择运行时常量而不是编译时常量

    你可以用关键字readonly来声明(declare)一个运行时常量,编译时常量是用关键字const声明的。

    //Compile time constant:
    public cocnst int _Millennium = 2000;
    //Runtime constant:
    public static readonly int _ThisYear = 2007;//(译注:原文为2004)

    编译时常量与运行时常量不同之处表现在如何对他们的访问上。

    一个编译时常量会被目标代码中的值直接取代。下面的代码:

    if(myDateTime.Year == _Millennium)

    会与下面写的代码编译成完全相同的IL代码:

    if(myDateTime.Year == 2000)

    运行时常量的值是在运行时确定的。当你引用一个只读常量时(read-only)IL会为你引用一个运行时常量的变量,而不是直接使用该值。

    编译器常量只能用来表示内置的整数、浮点数、枚举、字符串。

    因此你想new 一个对象是不可能实现的。

    如:

    const DateTime classCreateTime =new DateTime(2000,1,1,0,0,0);
    

    不是const 不想为你实现,而是做不到。

    好的,那我们到这里总结一下:const 和 readonly 的不同。

    1.一个readonly 是运行时候的常量,而const 是编译时候的常量。

    这一点毋容置疑,const 运行的速率更快。

    2.在readonly中可以实例化常量,二const 则不能,也就是只能是一些静态常量。

    这里说明了readonly比const慢,那么是否可以用const的地方,就用const呢?毕竟人家更快。

    答案却是相反的,const是为了使性能达到极致,但是const 会出现一些错误,如果用程序的速率去换稳健性的话,这并不是一笔好的买卖。

    为什么说const 稳健性下降呢?

    程序集Config:

    public class UsefulValues{
       public static readonly int StartValue=5;
       public const int EndValue=10; 
    }
    

    现在有另外一个程序集Application来引用配置:

    for(int i=UserfulValues.StartValue;i<EndValue.EndValue;i++)
    {
       //打印出来
    }
    

    第一次运行的时候,得到的结果是:5-9

    现在只修改config集,将EndValue改为100。

    第二次得到的结果为:5-9

    这是为什么呢?因为Application 没有从新编译,那么因为是const,里面写死了10。

    但是这只能说是const的一个特性,而不是说其缺点。

    比如说一些版本号,有3个程序集。applicationA,ApplicationB,ApplicationC。

    这3个程序集,要引用一个Config集的一个版本,第一个版本发布的时候是1.0。

    那么编译完就都是1.0了,那么动态打补丁的时候,applicationA 现在修改了,是2.0。

    而其他ApplicationB,ApplicationC 就还是1.0。

    这样使用该程序的人就知道ApplicationB,ApplicationC 使用的自己是1.0版本,这样方便开发人员找出问题。

    注:在一些大型客户端中更新的时候,不会去把每一个程序集都编译一遍。

    总结

    const 用来声明在编译就确定的值,其他的用readonly。

  • 相关阅读:
    多线程(一)--线程的运行
    多线程(二)--锁
    守护线程与用户线程
    SWD接口
    RS485,CAN
    tcp/ip协议
    开关电源与线性稳压电源
    与gps相比,北斗的三频信号有什么优势
    射频识别技术(RFID)
    wifi发射模块芯片各个管脚功能,蓝牙和wifi信号互相干扰,2.4GHZ无线技术
  • 原文地址:https://www.cnblogs.com/aoximin/p/12957132.html
Copyright © 2011-2022 走看看