C# 定义常量的两种方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _0223_定义常量的两种方法
{
    class Program
    {
        static void Main(string[] args)
        {
            //在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),
            //另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用
            //“readonly”来定义。
            //对于静态常量(Compile - time constant),它的书写方式如下:
            //public const int MAX_VALUE = 10;
            //为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意:如下书写
            //是错误的,会出编译错误,这里只是为了方便说明)。
            //public static const int MAX_VALUE = 10;
            //用const定义的常量,对于所有类对象而言都是一样的,因此需要像访问静态成
            //员那样去访问const定义的常量,而用对象的成员方式去访问会出变异错误。此
            //外,对于静态常量的访问在编译的时候,是用常量的值去替换常量,例如:
            //int nValue = MAX_VALUE;
            //这句在编译之后,和如下这句所产生的中间语言代码是一样的。
            //int nValue = 10;
            //不过,在用const来定义常量的时候,在类型上有很多限制。首先,此类型必须
            //属于值类型,同时此类型的初始化不能通过new来完成,因此一些用struct定义
            //的值类型常量也不能用const来定义。
            //相对于const而言,用readonly来定义常量要灵活的多,它的书写方式如下:
            //public readonly int MAX_VALUE = 10;
            //为什么称为动态变量,因为系统要为readonly所定义的常量分配空间,即和类
            //的其他成员一样拥有独立的空间。此外,readonly所定义的常量除了在定义的
            //时候可以设定常量值外,还可以在类的构造函数中进行设定。由于readonly所
            //定义的常量相当于类的成员,因此使用const来定义常量所受到的类型限制,
            //在使用readonly去定义的时候全部消失,即可以用readonly去定义任何类型的
            //常量。
            //对于在定义常量的时候,到底是用const来定义还是readonly来定义,我以前为
            //了追求性能,因此尽量用const来定义。但是在此书中,提到了一个关于使用const
            //会产生潜在的bug。就是在程序中使用DLL类库某个类的静态常量时,如果在类库
            //中修改静态常量的值,其它接口没有发生变化,一般来说,程序调用端是不需要
            //重新编译,直接执行就可以调用新的类库。不过就是在此情况下,会产生潜在的bug。
            //这是由于静态常量在编译的时候,是用它的值去替换常量,因此在调用端的程序也是这样进行替换的。
            //例如:在类库中定义了一个静态常量,如下:
            //public const int MAX_VALUE = 10;
            //那么对于程序中调用此静态常量这段代码,在编译后产生的中间语言代码中,
            //是用10来进行替换,即使用静态常量的地方,改为10了。
            //那么当类库的静态变量发生变化后,例如:
            //public const int MAX_VALUE = 15;
            //那么对于调用端程序是可以在没有重新编译的情况下进行运行,不过此时程序
            //的中间语言代码对应于静态变量的值是10,而不是新类库中的15。因此这样产
            //生的不一致,程序会引发潜在的bug。解决此类问题的方法,就是调用端程序
            //在更新类库之后重新编译一下,即生成新的中间语言代码。
            //对于如上在const定义常量时所存在的潜在bug,在用readonly定义常量时是不
            //会发生的。因为readonly定义的常量类似于类的成员,因此在访问的时候需要
            //根据具体常量地址来访问,从而避免此类bug。
            //鉴于此,本书建议用readonly来替换const去定义常量。
        }
    }
}

如上描述如有不懂,或想学习更多技术知识,可以扫码关注麒琳技术栈公众号,欢迎在线咨询

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ClementQL

机会只属于对自己更狠的人。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值