.NET中,const和readonly区别

在.NET中,const和readonly都用于定义不可变的值,但它们在行为和使用场景上有显著区别。以下是两者的详细对比:

  1. 初始化时机
    • const
    ◦ 编译时常量,必须在声明时赋值。
    ◦ 值在编译时确定,并被直接嵌入到IL代码中(类似字面量)。
    ◦ 示例:
    csharp
    public const int MaxValue = 100; // 必须直接赋值

• readonly

◦ 运行时常量,可以在声明时或构造函数中赋值。

◦ 值在运行时确定(如根据配置或逻辑动态计算)。

◦ 示例:

csharp

public readonly int MaxValue;

public MyClass(int value) {

MaxValue

= value; // 允许在构造函数中赋值

}

  1. 类型限制
    • const
    ◦ 仅支持基元类型(如int、bool、string)或null引用。
    ◦ 不支持复杂类型(如对象、数组、DateTime)。
    ◦ 示例:
    csharp
    public const string Name = "C#"; // 合法
    public const DateTime Date = default; // 编译错误(非基元类型)

• readonly

◦ 支持任意类型,包括对象、集合、自定义类等。

◦ 示例:

csharp

public readonly List Numbers = new List();

public readonly DateTime CreatedAt;

  1. 作用域
    • const
    ◦ 隐式静态(static),属于类级别,所有实例共享同一个值。
    ◦ 访问方式:ClassName.ConstName。
    ◦ 示例:
    csharp

Console.WriteLine(MyClass.MaxValue); // 直接通过类名访问

• readonly

◦ 默认为实例级别,每个对象可拥有不同的值。

◦ 也可声明为static readonly,此时为类级别。

◦ 示例:

csharp

public class MyClass {

public readonly int InstanceValue;

public static readonly int StaticValue = 42;

}

  1. 内存分配

    • const

    ◦ 值被编译到IL中,不占用实际内存空间(类似于字面量)。

    ◦ 修改后需重新编译所有依赖的程序集。

    • readonly

    ◦ 作为字段存储在内存中,每个实例或类有独立存储。

    ◦ 修改后仅需重新编译当前程序集。

  2. 版本控制

    • const

    ◦ 若修改const值,引用它的其他程序集必须重新编译,否则继续使用旧值(硬编码到IL中)。

    ◦ 易引发版本不一致问题。

    • readonly

    ◦ 修改后,依赖程序集无需重新编译即可获取新值(运行时解析)。

  3. 适用场景

    • const

    ◦ 数学常数、固定字符串等无需修改的全局值。

    ◦ 示例:

    csharp

public const double Pi = 3.14159;

public const string AppName = "MyApp";

• readonly

◦ 需运行时计算的配置值或对象。

◦ 示例:

csharp

public readonly string ConnectionString;

public readonly Lazy _data = new Lazy(LoadData);

通过合理选择const和readonly,可以提升代码的灵活性、可维护性和性能。

相关推荐
m0_706653233 分钟前
分布式系统安全通信
开发语言·c++·算法
寻寻觅觅☆35 分钟前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++
lightqjx1 小时前
【C++】unordered系列的封装
开发语言·c++·stl·unordered系列
zh_xuan1 小时前
kotlin lazy委托异常时执行流程
开发语言·kotlin
阿猿收手吧!1 小时前
【C++】string_view:高效字符串处理指南
开发语言·c++
玄同7652 小时前
我的 Trae Skill 实践|使用 UV 工具一键搭建 Python 项目开发环境
开发语言·人工智能·python·langchain·uv·trae·vibe coding
Yorlen_Zhang2 小时前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#
lxl13072 小时前
C++算法(1)双指针
开发语言·c++
不绝1912 小时前
C#进阶:预处理指令/反射,Gettype,Typeof/关键类
开发语言·c#
无小道2 小时前
Qt-qrc机制简单介绍
开发语言·qt