一、定义与特点
1.核心定义
- 常量是使用 const 关键字声明的不可变值,其值在编译时确定且在程序生命周期内不可修改。
- 与变量不同,常量必须在声明时初始化,且后续无法重新赋值。
2.主要用途
- 表示程序中固定不变的值(如数学常数 π、配置参数等)。
- 提升代码可读性和维护性(通过语义化命名代替“魔法数字”)。
二、数据类型与限制
1.支持的数据类型
- 仅限 C# 内置基本类型:int、double、string、char、bool 等。
- 不支持用户自定义类型(如类、结构体、数组),需用 readonly 关键字替代。
2.示例代码
const double Pi = 3.14159; // 浮点常量:ml-citation{ref="2,6" data="citationList"}
const string AppName = "MyApp"; // 字符串常量:ml-citation{ref="2" data="citationList"}
const int MaxItems = 100; // 整数常量:ml-citation{ref="2,6" data="citationList"}
三、作用域与生命周期
1.作用域规则
- 类级常量:声明在类内部,作用域为整个类(通过 public/private 等修饰符控制访问范围)。
- 局部常量:声明在方法或代码块内部,作用域仅限于当前上下文。
2.生命周期
- 常量的生命周期与程序一致,编译时直接替换为字面值,无需运行时内存分配47。
四、初始化规则
规则 | 说明 |
---|---|
必须显式初始化 | 常量声明时必须赋值,否则编译报错。 |
表达式合法性 | 初始化表达式需为编译时可计算的常量值(如 3.14 或 “Hello”)。 |
多常量声明 | 同一语句可声明多个同类型常量(如 const int a=1, b=2;)。 |
五、使用注意事项
1.命名规范
- 推荐使用全大写字母或 PascalCase 命名(如 MAX_USERS 或 DefaultTimeout)。
2.与 readonly 的区别
特性 | const | readonly |
---|---|---|
初始化时机 | 编译时(声明时) | 运行时(构造函数中) |
数据类型 | 仅限内置类型 | 支持用户自定义类型 |
3.跨程序集引用风险
- 引用其他程序集的常量时,若原程序集更新常量值,需重新编译当前程序集才能生效。
总结
const 常量:编译时确定、不可变、适用于简单固定值。
readonly 常量:运行时初始化、支持复杂类型、适用于动态场景。