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

相关推荐
唐青枫39 分钟前
C#.NET dapper 详解
c#·.net
爱装代码的小瓶子2 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
Maybe_ch3 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王3 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
Edingbrugh.南空4 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
CodeCraft Studio5 小时前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_4376643145 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
aramae5 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
封奚泽优5 小时前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui