C#常考随笔1:const和readonly有什么区别?

在 C# 中,constreadonly都用于定义不可变的值

定义与初始化

  • const
    • const用于定义编译时常量,在编译时就必须为其赋值,且赋值后在整个程序运行期间都不能再修改。
    • 只能使用基本数据类型(如intdoublebool等)、枚举类型或字符串类型来定义常量。
    • 必须在声明时就进行初始化,不能在后续代码中再赋值。
    • 示例:
cs 复制代码
public class ExampleClass
{
    public const int ConstantValue = 10;
}
  • readonly
    • readonly用于定义运行时常量,它可以在声明时初始化,也可以在构造函数中进行初始化。一旦初始化完成,其值就不能再被修改。
    • 可以是任何数据类型,包括自定义类、结构体等引用类型。
    • 示例:
cs 复制代码
public class ExampleClass
{
    public readonly int ReadonlyValue;

    public ExampleClass(int value)
    {
        ReadonlyValue = value;
    }
}

内存分配与使用

  • const
    • const常量在编译时会被直接替换为其对应的值,因此不会在运行时分配额外的内存空间。例如,当代码中使用const常量时,编译器会将其替换为具体的常量值,而不是通过变量引用。
    • 示例代码:
cs 复制代码
const int a = 5;
int result = a + 3; // 编译时,a 会被直接替换为 5
  • readonly
    • readonly变量在运行时分配内存空间,其值在初始化后存储在该内存中。每次访问readonly变量时,都会通过该内存地址来获取其值。
    • 示例代码:
cs 复制代码
readonly int b = 5;
int result = b + 3; // 运行时通过内存地址访问 b 的值

静态与实例

  • const
    • const成员隐式地为静态成员,不能使用static关键字来修饰const常量。可以通过类名直接访问const常量,无需创建类的实例。
    • 示例:
cs 复制代码
public class MyClass
{
    public const string MyConstant = "Hello";
}

// 直接通过类名访问
string value = MyClass.MyConstant;
  • readonly
    • readonly可以是实例成员,也可以是静态成员。当作为实例成员时,每个类的实例都可以有不同的readonly值;当使用static关键字修饰时,它成为静态成员,可通过类名直接访问。
    • 示例:
cs 复制代码
public class MyClass
{
    public readonly int InstanceReadonly;
    public static readonly int StaticReadonly = 20;

    public MyClass(int value)
    {
        InstanceReadonly = value;
    }
}

// 实例成员访问
MyClass obj = new MyClass(10);
int instanceValue = obj.InstanceReadonly;

// 静态成员访问
int staticValue = MyClass.StaticReadonly;

继承与多态

  • const
    • 由于const是编译时常量,在子类中不能重写父类的const成员。如果子类中定义了与父类同名的const常量,它们是完全独立的两个常量。
    • 示例:
cs 复制代码
class ParentClass
{
    public const int MyConst = 10;
}

class ChildClass : ParentClass
{
    public const int MyConst = 20; // 与父类的 MyConst 是不同的常量
}
  • readonly
    • 对于实例readonly成员,每个实例可以有不同的初始值,表现出一定的灵活性。而静态readonly成员在类的所有实例间共享同一个值。在继承体系中,子类不能重写父类的readonly成员,但可以在子类中定义自己的readonly成员。
    • 示例:
cs 复制代码
class ParentClass
{
    public readonly int MyReadonly = 10;
}

class ChildClass : ParentClass
{
    public readonly int MyReadonly = 20; // 子类自己的 readonly 成员
}
相关推荐
Peter 谭10 分钟前
React Hooks 实现原理深度解析:从基础到源码级理解
前端·javascript·react.js·前端框架·ecmascript
ll77881122 分钟前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
我不想当小卡拉米39 分钟前
【Linux】操作系统入门:冯诺依曼体系结构
linux·开发语言·网络·c++
teacher伟大光荣且正确1 小时前
Qt Creator 配置 Android 编译环境
android·开发语言·qt
炎芯随笔1 小时前
【C++】【设计模式】生产者-消费者模型
开发语言·c++·设计模式
乌鸦9441 小时前
《类和对象(下)》
开发语言·c++·类和对象+
炒空心菜菜1 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
LuckyLay2 小时前
React百日学习计划——Deepseek版
前端·学习·react.js
多多*2 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
gxn_mmf2 小时前
典籍知识问答重新生成和消息修改Bug修改
前端·bug