You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:36:00