const和readonly区别

内容来源<<你必须知道的.NET>>

标题:什么才是不变:const和readonly

时间:2008-10-10

内容:

    我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:

1. static readonly MyClass myins = new MyClass();
2. static readonly MyClass myins = null;
3. static readonly B = 10;   static readonly A = B * 20;
4. static readonly int [] constIntArray = new int[] {1, 2, 3};
5. void SomeFunction()
   {
      const int a = 10;
      ...
   }
6.private static string astr="abcd";
  private const string str = astr+"efg";
1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。

6.错误:如果在astr前加上const或者const改为readonly即可;

总结:1.const、readonly和static readonly定义的常量,指定初始值后(包括在构造函数内指定的初始值) 将不可更改,可读不可写;
        2.const定义时必须指定初始值,而readonly定义时可以不进行初始化(MS建议在定义时初始值),同时也可以在构造函数内指定初始值,

          并以构造函数内指定的值为准;

        3.const和static readonly定义的常量是静态的,只能由类直接访问;而readonly定义的常量是非静态 的,只能由实例对象访问;  
        4.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数;
        5.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。在应用上以static readonly代替const,以平衡const在灵活性上的不足,
           同时克服编译器优化cosnt性能,所带来的程序集引用不一致问题;  
     

 

转载于:https://www.cnblogs.com/morningwang/archive/2008/10/10/1308325.html

<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、付费专栏及课程。

余额充值