局部常量

局部常量(Local Constants)

局部常量和局部变量十分相似,区别在于:常量初始化后,值不可修改

和局部变量一样,常量必须在代码块内声明。

常量两大核心特性:

  1. 声明时必须初始化赋值
  2. 声明完成后,值不允许修改

常量基础语法

const 类型 常量名 = 初始值;

// const:关键字,必须紧贴类型前方
// = 初始值:不可省略,强制要求
Code language: JavaScript (javascript)

语法规则说明

和普通字段 / 变量声明相比,两处区别:

  1. 类型前增加const关键字;
  2. 必须提供初始化值,且该值编译期就能确定
    • 通常是基础简单类型字面量、由基础类型组成的表达式;
    • 可以赋值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)
PI常量的作用域,红色区域,和变量其实一样,就是它所在的上一级代码块{},PI的上一级代码块就是方法体{}的大括号

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注