const 和 readonly 的区别

本文详细对比了C#中const和readonly的区别,包括初始化方式、使用场景及类型限制等,并介绍了static readonly的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const 和 readonly 的区别,总是不太清楚,于是查了查资料。

  const 的概念就是一个包含不能修改的值的变量。
常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取的值来初始化常量。
如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的。


  readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。
因为 readonly 是在计算时执行的,当然它可以用某些变量初始化。
readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。


readonly 关键字与 const 关键字不同。

1. const 字段只能在该字段的声明中初始化。
   readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
4.const 对于引用类型的常数,可能的值只能是 string 和 null。
   readonly可以是任何类型

* 需要注意的一个问题是:

对于一个 readonly 的 Reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。

public static readonly Class1 my = new Class1();

my.SomeProperty = 10; //正常
my = new Class1(); //出错,该对象是只读的

但是,如果上例中的 Class1 不是一个 Class 而是一个 struct,那么后面的两个语句就都会出错。

static readonly:

Java 中 static 是当载入一个类时执行一次的。

C#中是怎么执行的,我没有查到。很奇怪几乎每本java的书都会说static的问题,C#的往往只说怎么用,但是应该是在main函数调用之前初始化,所以static readonly也是运行时的,可以用变量付值,如:

private static readonly string path = System.Windows.Forms.Application.StartupPath + “aaa”;

 

<think>好的,我现在需要回答用户关于TypeScript中constreadonly关键字的区别使用场景的问题。首先,我得回忆一下这两个关键字的基本概念用法。 根据提供的引用资料,const用于声明变量,必须在声明时初始化,并且之后不能重新赋值。比如引用[5]中的例子,const message = 'Hello'之后不能再赋值为'World'。而readonly用于类的属性,可以在构造函数中初始化,确保属性在实例化后不可变。例如引用[3]提到,readonly适用于类属性,允许在构造函数中赋值,之后不能修改。 接下来,我需要整理它们的区别。首先是作用范围的不同:const用于变量,而readonly用于类属性接口/类型别名中的属性。初始化时机方面,const必须在声明时初始化,而readonly可以在声明时或构造函数中初始化。引用[3][5]都强调了这一点。 然后是可变的程度。对于对象或数组,const变量虽然不能重新赋值,但内部属性或元素可以修改。而readonly属性如果是引用类型,同样内部可能可变,但结合readonly修饰符如ReadonlyArray可以禁止修改。引用[4]中的例子展示了如何用泛型创建只读数组,增强不可变性。 使用场景方面,const适用于任何需要不可重新赋值的变量,如配置项或数学常数。而readonly更多用于类或接口中,确保属性在实例化后不变,适合领域模型或DTO。引用[3][4]提到了这些应用场景。 需要确认是否覆盖了所有关键点,比如编译时检查、类型系统中的表现。比如const在编译后会被替换为具体值,而readonly是类型系统的约束,编译后消失。这点引用中没有明确提到,可能需要结合自己的知识补充,但根据现有资料,应该主要依据引用内容。 最后生成相关问题,要基于用户可能感兴趣的方向,比如如何选择两者,实际应用中的注意事项,或者其他语言类似关键字的对比。确保问题主题相关,并且有参考资料支持。 总结一下,回答的结构应该是先概述区别,然后详细分点说明,最后给出使用场景示例代码,最后附相关问题。要确保引用正确,比如每个区别点对应的引用编号,并保持语言自然。</think>### TypeScript中constreadonly的差异解析 #### 一、核心区别对比 | 特征 | const | readonly | |--------------------|---------------------------|-------------------------| | **作用对象** | 变量(包括基本/引用类型) | 类属性、接口/类型属性 | | **初始化时机** | 必须声明时初始化 | 可在构造函数中初始化 | | **可变性范围** | 禁止变量重新赋值 | 禁止属性重新赋值 | | **编译后表现** | 替换为具体值(基本类型) | 类型约束(编译时擦除) | | **类型系统支持** | JavaScript原生特性 | TypeScript类型增强特性 | #### 二、具体差异详解 1. **作用范围不同** - const适用于所有变量声明场景,如: ```typescript const PI = 3.1415; // 基本类型 const config = { env: 'prod' }; // 引用类型 ``` - readonly专用于类属性类型定义: ```typescript class User { readonly id: string; // 类属性 constructor(id: string) { this.id = id; } } type Point = { readonly x: number; // 类型属性 } ``` 2. **初始化灵活性差异** const变量必须立即初始化(引用[5]),而readonly属性允许延迟到构造函数: ```typescript class Logger { readonly logPath: string; // ✔️合法 constructor() { this.logPath = '/app.log'; // 构造器内初始化 } } ``` 3. **引用类型处理方式** const变量绑定的是引用地址(可修改内部属性): ```typescript const arr = [1,2,3]; arr.push(4); // ✔️允许操作 ``` readonlyReadonlyArray配合可实现完全不可变: ```typescript const arr: readonly number[] = [1,2,3]; arr.push(4); // ❌编译错误(引用[4]) ``` #### 三、使用场景建议 - **优先使用const的场景** - 全局配置对象(禁止重新赋值) - 数学常数(如$PI = 3.1415$) - 临时计算中间值 - **优先使用readonly的场景** - DTO数据传输对象属性 ```typescript interface ProductDTO { readonly id: string; readonly price: number; } ``` - 类实例标识属性 ```typescript class Order { readonly orderNo: string; constructor(no: string) { this.orderNo = no; // 初始化后不可变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值