当前位置: 首页 > news >正文

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

相关文章:

  • 鸿蒙NEXT开发剪贴板工具类(ArkTs)
  • Gradle安装与配置国内镜像源指南
  • 【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组
  • 零基础教学:用GISBox将RVT转为3DTiles
  • 日本企业突破机器人感知技术:人形机器人获嗅觉能力
  • 那些年踩过的坑之Arrays.asList
  • 7.Excel:单元格格式
  • Easysearch 基础运维扫盲指南:从 HTTP 到 HTTPS、认证与安全访问全解析
  • OpenCV 图形API(64)图像结构分析和形状描述符------在图像中查找轮廓函数findContours()
  • AI编程:[体验]从 0 到 1 开发一个项目的初体验
  • 如何在IDEA中高效使用Test注解进行单元测试?
  • 产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号
  • 前端面试(Vue React)内容目录与备考建议
  • websheet 之 sheet操作
  • Spark-Streaming(三)
  • 逐行解析性能奥秘:借助 `line_profiler` 深入优化热点函数
  • Node.js 开发项目
  • Antd Modal Drawer 更改默认项
  • 【leetcode刷题日记】lc.73-矩阵置零
  • 一些有关ffmpeg 使用(1)
  • 准“90后”山西壶关县委常委、副县长高雅亭赴北京密云挂职
  • 王毅会见乌兹别克斯坦外长赛义多夫
  • “住手!”特朗普罕见公开谴责普京,俄称愿恢复对话但要看美方行动
  • 陕西省烹饪餐饮行业领军人物黄建军逝世,终年53岁
  • 全品系停货?泸州老窖:暂未接到通知,常规调控手段
  • 天问三号开放20千克质量资源,邀国际合作开展火星探测研究