zoukankan      html  css  js  c++  java
  • C#中的static、readonly与const的比较

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。 
    1、工作原理 
    readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。 
    const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。 
    下面声明两个常量:

    public static readonly int A = 2; //A为运行时常量 
    public const int B = 3; //B为编译时常量 

    int C = A + B; 
    经过编译后与下面的形式等价:

    int C = A + 3; 
    可以看到,其中的const常量B被替换成字面量3,而readonly常量A则保持引用方式。 


    2、声明及初始化 
    readonly常量只能声明为类字段,支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。 
    const常量除了可以声明为类字段之外,还可以声明为方法中的局部常量,默认为静态类型(无需用static修饰,否则将导致编译错误),但必须在声明的同时完成初始化。

    数据类型支持上
        由于const常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。下面的代码无法通过编译:

    public const DateTime D = DateTime.MinValue; 
    改成readonly就可以正常编译:

    public readonly DateTime D = DateTime.MinValue; 


    3、可维护性 
    readonly以引用方式进行工作,某个常量更新后,所有引用该常量的地方均能得到更新后的值。 
    const的情况要稍稍复杂些,特别是跨程序集调用(版本控制问题):

    public class Class1 

        public static readonly int A = 2; //A为运行时常量 
        public const int B = 3; //B为编译时常量 
    }

    public class Class2 

        public static int C = Class1.A + Class1.B; //变量C的值为A、B之和 
    }

    Console.WriteLine(Class2.C); //输出"5" 
    假设Class1与Class2位于两个不同的程序集,现在更改Class1中的常量值:

    public class Class1 

        public static readonly int A = 2; //A为运行时常量 
        public const int B = 5; //B为编译时常量 

    编译Class1并部署(注意:这时并没有重新编译Class2),再次查看变量C的值:

    Console.WriteLine(Class2.C); //输出"5" 
    结果可能有点出乎意料,让我们来仔细观察变量C的赋值表达式:

    public static int C = Class1.A + Class1.B; 
    编译后与下面的形式等价:

    public static int C = Class1.A + 3; 
         因此不管常量B的值如何变,对最终结果都不会产生影响。虽说重新编译Class2即可解决这个问题,但至少让我们看到了const可能带来的维护问题。

    4、性能比较 
        const直接以字面量形式参与运算,性能要略高于readonly,但对于一般应用而言,这种性能上的差别可以说是微乎其微。

    5、适用场景 
        在下面两种情况下: 
        a.取值永久不变(比如圆周率、一天包含的小时数、地球的半径等) 
        b.对程序性能要求非常苛刻 
        可以使用const常量,除此之外的其他情况都应该优先采用readonly常量。

  • 相关阅读:
    The Quad
    将OrCAD Capture CIS的设计文件(.dsn)导入到PADS Logic VX.2.3
    OrCAD Capture CIS 16.6 将版本16.6的设计文件另存为版本16.2的设计文件
    Eclipse IDE 添加jar包到Java工程中
    PADS Logic VX.2.3 修改软件界面语言
    切换Allegro PCB Editor
    Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件
    Allegro PCB Design GXL (legacy) 设置自动保存brd文件
    Could not create an acl object: Role '16'
    windows 下apache开启FastCGI
  • 原文地址:https://www.cnblogs.com/xiaohua19920/p/9596374.html
Copyright © 2011-2022 走看看