.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,可以提升代码的灵活性、可维护性和性能。

相关推荐
知远同学2 小时前
Anaconda的安装使用(为python管理虚拟环境)
开发语言·python
小徐Chao努力2 小时前
【Langchain4j-Java AI开发】09-Agent智能体工作流
java·开发语言·人工智能
CoderCodingNo2 小时前
【GESP】C++五级真题(贪心和剪枝思想) luogu-B3930 [GESP202312 五级] 烹饪问题
开发语言·c++·剪枝
kylezhao20192 小时前
第1章:第一节 开发环境搭建(工控场景最优配置)
开发语言·c#
啃火龙果的兔子2 小时前
JavaScript 中的 Symbol 特性详解
开发语言·javascript·ecmascript
热爱专研AI的学妹3 小时前
数眼搜索API与博查技术特性深度对比:实时性与数据完整性的核心差异
大数据·开发语言·数据库·人工智能·python
Mr_Chenph3 小时前
Miniconda3在Windows11上和本地Python共生
开发语言·python·miniconda3
阿狸远翔3 小时前
Protobuf 和 protoc-gen-go 详解
开发语言·后端·golang
永远前进不waiting3 小时前
C复习——1
c语言·开发语言
伯明翰java3 小时前
Java数据类型与变量
java·开发语言