当前位置: 首页 > 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,可以提升代码的灵活性、可维护性和性能。

http://www.xdnf.cn/news/141337.html

相关文章:

  • NLP高频面试题(五十五)——DeepSeek系列概览与发展背景
  • 自动清空 maven 项目临时文件,vue 的 node_modules 文件
  • Virtuoso ADE采用Spectre仿真中出现MOS管最小长宽比满足要求依然报错的情况解决方法
  • 【高频考点精讲】async/await原理剖析:Generator和Promise的完美结合
  • RTMP 入门指南
  • Aloudata Agent :基于 NoETL 明细语义层的分析决策智能体
  • Linux阻塞与非阻塞I/O:从原理到实践详解
  • 学硕热度下降,25西电数学与统计学院(考研录取情况)
  • 高频面试题:如何保证数据库和es数据一致性
  • ES历史版本下载
  • 第TR5周:Transformer实战:文本分类
  • 图像识别系统 - Ubuntu部署指南(香橙派开发板测试)-学习记录1
  • MySQL 详解之函数:数据处理与计算的利器
  • HOW - 如何模拟实现 gpt 展示答案的交互效果
  • form表单提交前设置请求头request header及文件下载
  • 线程怎么创建?Java 四种方式一网打尽
  • uniapp 仿企微左边公司切换页
  • FreeRTOS
  • 斗鱼娱乐电玩平台源码搭建实录
  • 短视频矩阵系统可视化剪辑功能开发,支持OEM
  • QT 连接数据库操作(15)
  • Pandas 数据导出:如何将 DataFrame 追加到 Excel 的不同工作表
  • 银发科技:AI健康小屋如何破解老龄化困局
  • MYSQL之数据类型
  • 【MySQL】3分钟解决MySQL深度分页问题
  • git 命令集
  • 【Web应用服务器_Tomcat】一、Tomcat基础与核心功能详解
  • 如何配置Spark
  • Spring-Framework源码环境搭建
  • 7.10 GitHub Sentinel CLI开发实战:Python构建企业级监控工具的5大核心技巧