C#中的常量(const和readonly)
C# 程序中,变量是随时可以改变值的量,那么,在遇到不允许改变值的情况时,该怎么办呢?这就是本节将要讲解的常量。
常量就是程序在运行过程中,值不能改变的量,比如现实生活中的居民身份证号码、数学运算中的 π 值等,这些都是不会发生改变的,它们都可以被定义为常量。
常量可以分为不同的类型,比如 98、368 是整数类型常量,3.14、0.25 是实数常量,即浮点类型的常量,'m'、'r' 是字符常量。
const 常量也叫静态常量,它的值在编译时就已经确定了。const 常量的值必须在声明时就进行初始化,而且之后不可以再更改。
例如,声明一个正确的 const 常量,同时声明一个错误的 const 常量,以便读者对比参考,代码如下:
从字面上理解,readonly 常量可以进行动态赋值,但需要注意的是,这里的动态赋值是有条件的,它只能在构造函数中进行,例如,下面的代码:
如果要在构造函数以外的位置修改 readonly 常量的值,比如,在 Main() 方法中进行修改,代码如下:

图 1 试图在构造函数以外的位置修改 readonly 常量值的错误提示
常量就是程序在运行过程中,值不能改变的量,比如现实生活中的居民身份证号码、数学运算中的 π 值等,这些都是不会发生改变的,它们都可以被定义为常量。
常量可以分为不同的类型,比如 98、368 是整数类型常量,3.14、0.25 是实数常量,即浮点类型的常量,'m'、'r' 是字符常量。
C#常量的分类
常量主要有两种,分别是 const 常量和 readonly 常量,下面分别对这两种常量进行讲解。1) const常量
在 C# 中提到常量,通常指的是 const 常量。const 常量也叫静态常量,它的值在编译时就已经确定了。const 常量的值必须在声明时就进行初始化,而且之后不可以再更改。
例如,声明一个正确的 const 常量,同时声明一个错误的 const 常量,以便读者对比参考,代码如下:
const double PI = 3.1415926; // 正确的声明常量的方法 const int MyInt; // 错误:声明常量时没有初始化
2) readonly常量
readonly 常量是一种特殊的常量,也被称为动态常量。从字面上理解,readonly 常量可以进行动态赋值,但需要注意的是,这里的动态赋值是有条件的,它只能在构造函数中进行,例如,下面的代码:
class Program { readonly int Price; // 定义一个readonly常量 Program() // 构造函数 { Price = 368; // 在构造函数中修改readonly常量的值 } static void Main(string[] args) { } }
如果要在构造函数以外的位置修改 readonly 常量的值,比如,在 Main() 方法中进行修改,代码如下:
class Program { readonly int Price; // 定义一个readonly常量 Program() // 构造函数 { Price = 368; // 在构造函数中修改readonly常量的值 } static void Main(string[] args) { Program p = new Program(); // 创建类的对象 p.Price = 365; // 试图对readonly常量的值进行修改 } }这时再运行程序,将会出现如下图所示的错误提示:

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