zoukankan      html  css  js  c++  java
  • 慎用const关键字

    我们在coding的时候,经常会做一个Config类,里面定义一些系统的公用变量。
    可能里面会出现这样的代码: public const string PBD_Sys = @"……"; 也有可能会有人写成这样的样子:
    public static readonly string TempUnZipFilePath = "NewVersion"; 那么,这两种方式究竟有哪些不同呢?一个是采用的const,一个采用static readonly。

    这个涉及到一点编译器的工作方式。比如说,上面的代码出现在类config中,config所在的project,我们命名为A。我们在projectB中调用projectA,这个时候,const和static readonly就会有一些小小的区别,有的时候,这个小小的区别,就会造成一个重大的bug
    代码如下(Project A中):
    public class Config
    {
    public const string PBDSys = "PDB";

    public static readonly string TempUnZipFilePath = "NewVersion";
    }
    Project B中(为了说明问题,本例中B是一个控制台应用程序):
    [STAThread]
    static void Main(string[] args)
    {
    Console.WriteLine(Config.PBDSys);

    Console.WriteLine(Config.TempUnZipFilePath);
    }
    显而易见,结果如下:
    PDB
    NewVersion

    这个时候,如果修改Project A中的代码如下:
    public class Config
    {
    public const string PBDSys = "PDBE";

    public static readonly string TempUnZipFilePath = "OldVersion";
    }
    然后重新编译A。再次运行ProjectB的Bin目录下的EXE。结果将会比较有趣。
    PDB
    OldVersion

    这里就体现了const关键字和readonly关键字的差异。
    C#在处理const关键字的时候,直接嵌入值来进行编译。
    而在处理readonly关键字的时候,是动态引用的。查看IL,可以很明显的看到两者的区别。

    .method private hidebysig static void Main(string[] args) cil managed
    {
    .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
    .entrypoint
    // Code Size: 21 byte(s)
    .maxstack 1
    L_0000: ldstr "PDB" //直接加载const
    L_0005: call void [mscorlib]System.Console::WriteLine(string)
    L_000a: ldsfld string ConsoleApplication1.Config::TempUnZipFilePath //引用加载readonly变量的值
    L_000f: call void [mscorlib]System.Console::WriteLine(string)
    L_0014: ret
    }

    所以,我们要注意到这个细节,确保一个值一定是一个常量的时候,才采用const关键字。否则,当我们发布程序的时候(尤其是插件式的这种),会有些不可预知的错误发生。本来客户仅仅需要Down一个新版本的dll就可以了,但是如果采用const关键字的话,可能会导致客户需要更新所有的装配件才能获取新版本的功能。

  • 相关阅读:
    hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
    bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
    codevs 1191 树轴染色 线段树区间定值,求和
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
    tyvj:1038 忠诚 线段树 区间查询
    KL散度
    NumPy 从已有的数组创建数组
    NumPy 创建数组
    NumPy 数组属性
    NumPy 数据类型
  • 原文地址:https://www.cnblogs.com/ahao214/p/const.html
Copyright © 2011-2022 走看看