一、三个关键字核心定义
1. const 常量
编译时常量,值在编译时就固定死,永远不能修改
2. readonly 实例只读字段
实例只读,只能在声明时、非静态构造函数赋值,运行时赋值
3. static readonly 静态只读字段
静态只读,只能在声明时、静态构造函数赋值,全局共享只读
二、代码逐行解析(核心规则)
cs
public class People
{
// 1. 实例只读字段
public readonly int a = 10;
// 2. 静态只读字段
public static readonly int b = 20;
// 3. 常量
public const int c = 30;
}
1. const 常量特点
-
默认自带 static(隐性静态)
-
必须声明时直接赋值
-
任何地方都不能二次修改
-
调用方式:类名.常量名
2. readonly 实例只读字段
-
属于对象(实例)
-
赋值时机:声明时 / 非静态构造函数
-
构造函数执行完毕后,彻底只读,无法修改
-
不能在静态构造函数修改
3. static readonly 静态只读字段
-
属于类,全局共享
-
赋值时机:声明时 / 静态构造函数
-
不能在普通构造函数修改
-
静态构造函数只执行一次
三、赋值权限细则(必考)
1. readonly 实例只读
✅ 允许:声明赋值、普通构造函数赋值
❌ 禁止:方法中赋值、外部赋值、静态构造函数赋值
2. static readonly 静态只读
✅ 允许:声明赋值、静态构造函数赋值
❌ 禁止:普通构造函数赋值、方法赋值、外部赋值
3. const 常量
✅ 允许:仅声明时赋值
❌ 禁止:任何位置二次赋值(包括构造函数)
四、静态构造函数 专属知识点
cs
// 静态构造函数:无修饰符、无参数、只执行一次
static People()
{
b = 40; // 唯一可以修改静态只读的构造函数
Console.WriteLine("静态构造函数只执行一次");
}
静态构造函数特点
-
不能加任何访问修饰符(public / private 都不行)
-
无参数、不能重载
-
全局只执行一次
-
触发时机:第一次 new 对象 / 第一次访问静态成员
-
专门用来初始化 静态、静态只读 成员
五、外部访问规则
cs
People p1 = new People();
//p1.a = 30; // 报错:只读字段无法修改
Console.WriteLine(People.b); // 静态只读 → 类名访问
Console.WriteLine(People.c); // 常量 → 类名访问
-
实例只读 readonly:对象名访问,不可修改
-
静态只读 / 常量:类名访问,不可修改
六、三者终极对比表(背诵版)
| 关键字 | 归属 | 可赋值位置 | 是否静态 | 修改权限 |
|---|---|---|---|---|
| const | 类(全局) | 仅声明时赋值 | 默认静态 | 完全不可改 |
| readonly | 对象实例 | 声明、普通构造函数 | 非静态 | 构造后不可改 |
| static readonly | 类 | 声明、静态构造函数 | 静态 | 构造后不可改 |
七、满分必考口诀
-
const常量写死值,全程不能改
-
readonly实例只读,普通构造赋值
-
static readonly静态只读,静态构造赋值
-
静态构造无修饰,全局一生只一次
-
常量默认是静态,只能类名点调用