Dart中使用const构造函数创建的对象是否属于编译时常量?
Dart const对象规则与const构造函数编译特性
const创建对象的常量规则
- 引用不可变:const修饰的对象变量本身是编译时常量,无法重新赋值为其他实例。
- 深层不可变:Dart强制要求const对象的所有属性必须为
final类型,对象创建后内部的任何属性都无法修改,和仅限制引用不可变的final修饰对象有本质区别。 - 常量去重:只要参数完全一致,无论在代码多少处声明同参数的const对象,编译后只会生成同一个实例,内存中仅存储一份。
const构造函数创建对象的编译时机
分两种情况:
- 显式用
const关键字调用const构造函数,或者调用位置处于const上下文(例如const集合的元素、const构造函数的入参)时,对象会在编译阶段完成创建,提前分配到常量内存区,运行时不需要再执行实例化操作,性能更优。 - 没有加
const关键字、且不在const上下文内调用const构造函数时,创建的是运行时普通实例,不属于编译时常量,也不会享受常量去重优化。
可以参考以下代码示例:
class Person { final String name; final int age; // 定义const构造函数 const Person({required this.name, required this.age}); } void main() { // 同参数const构造函数调用,指向同一个实例 const p1 = Person(name: "小明", age: 18); const p2 = Person(name: "小明", age: 18); print(p1 == p2); // 输出 true // 省略const,非const上下文调用,生成运行时实例 final p3 = Person(name: "小明", age: 18); print(p1 == p3); // 输出 false // const上下文内省略const,依然生成编译时常量 const list = [Person(name: "小红", age: 20)]; const p4 = Person(name: "小红", age: 20); print(list[0] == p4); // 输出 true }
内容的提问来源于stack exchange,提问作者Aarij Amir
相关产品推荐
相关产品推荐

