
3.4 常量
通过对前面的学习,我们知道了变量是随时可以改变值的量,那么,在遇到不允许改变值的情况时,该怎么办呢?这就需要用到本节要讲解的常量。
3.4.1 常量是什么

常量就是在程序运行过程中,值不能改变的量。比如,现实生活中的居民身份证号码、数学运算中的π 值等,这些都不会发生改变,它们都可以定义为常量。常量可以区分为不同的类型。例如,98、368 是整型常量;3.14、0.25 是实数常量,即浮点类型的常量;'m'、'r' 是字符常量。
3.4.2 常量的分类

常量主要有两种,分别是const 常量和readonly 常量,下面分别对这两种常量进行讲解。
1.const 常量
在C# 中提到常量,通常指的是const 常量。const 常量也称为静态常量,它在编译时值就已经确定了。const 常量的值必须在声明时就进行初始化,而且之后不可以进行更改。
例如,声明一个正确的const 常量,同时再声明一个错误的const 常量,以便读者对比参考,代码如下。

2.readonly 常量
readonly 常量是一种特殊的常量,也称为动态常量。从字面上理解,readonly 常量可以进行动态赋值,但需要注意的是,这里的动态赋值是有条件的,它只能在构造函数中进行赋值,例如下面的代码。

在构造函数以外的位置修改readonly 常量的值,比如,在Main 方法中进行修改,代码如下。

这时再运行程序,将会出现如图3.14 所示的错误提示信息。

图3.14 在构造函数以外的位置修改readonly 常量的值时出现的错误提示信息
3.const 常量与readonly 常量的区别
const 常量与readonly 常量的主要区别如下。
(1)const 常量必须在声明时初始化,而readonly 常量则可以在构造函数中初始化。
(2)const 常量在编译时就被解析,即将常量的值替换成初始化的值,而readonly 常量的值需要在运行时确定。
(3)const 常量可以定义在类中或方法体中,而readonly 常量只能定义在类中。