局部常量(Local Constants)
局部常量和局部变量十分相似,区别在于:常量初始化后,值不可修改。
和局部变量一样,常量必须在代码块内声明。
常量两大核心特性:
- 声明时必须初始化赋值;
- 声明完成后,值不允许修改。
常量基础语法
const 类型 常量名 = 初始值;
// const:关键字,必须紧贴类型前方
// = 初始值:不可省略,强制要求
Code language: JavaScript (javascript)
语法规则说明
和普通字段 / 变量声明相比,两处区别:
- 类型前增加
const关键字; - 必须提供初始化值,且该值编译期就能确定:
- 通常是基础简单类型字面量、由基础类型组成的表达式;
- 可以赋值
null; - 不能赋值对象实例引用(对象引用运行时才确定,不符合编译期常量要求)。
class Program
{
static void Main()
{
int a = 10; //这是一个变量
const int b = 20; //这是一个常量 和变量差不多
//前面有个const关键字 代表这个变量是一个常量
a = 100; //变量可以被修改
a = 200; //修改多少次都可以
// 错误
b = 300; //常量不能被修改,编译器会报错
//常量的好处是可以提高代码的可读性和可维护性
int c; //声明
c = 12; //变量是可以这样分开
//常量不允许声明和初始化分开写
// 错误
const double d; //声明
d = 3.14; //变量是可以这样分开
}
}Code language: C# (cs)

以上两处错误,第一处是尝试修改常量的值;第二处是常量的声明和初始化分开,声明和初始化必须同时完成。
class对象可以做常量吗?
赋值给常量phone的表达式必须是编译期常量
new Phone() 会在程序运行时分配堆内存、创建对象,属于运行时值;
C# 不允许将运行时对象引用赋值给const局部常量,直接触发 CS0133。
class Program
{
static void Main()
{
const Phone phone = new Phone();
}
}
class Phone
{
}Code language: C# (cs)

关键字补充说明
const不属于修饰符,是声明语法的核心组成,必须直接写在数据类型前面。
前面说的private public protected等等这些才是修饰符。
作用域规则与示例
局部常量和局部变量作用域规则完全一致:在方法 / 代码块内声明,代码块结束则常量失效、出作用域。
void ShowArea()
{
const double PI = 3.1416; // 声明局部常量PI
for (int radius = 1; radius <= 5; radius++) //循环输出半径从1-5的圆的面积
{
double area = radius * radius * PI; // 读取常量PI的值
Console.WriteLine($"半径: {radius}, 面积: {area}");
}
}
Code language: C# (cs)
常量PI仅在ShowArea方法内部可用,方法执行结束后销毁。
class Program
{
static void Main()
{
ShowArea();
}
static void ShowArea()
{
const double PI = 3.1416;
for (int radius = 1; radius <= 5; radius++)
{
double area = radius * radius * PI;
Console.WriteLine($"Radius: {radius}, Area: {area}");
}
}
}
Code language: C# (cs)
