Dart中使用带常量构造函数的类创建对象时为何要显式加const?
问题解答
Dart并不会自动将const构造函数的调用默认生成常量实例,具体规则和原因如下:
- 核心规则:
const是需要显式声明的修饰符(仅在强制要求常量的上下文中会隐式生效)SizedBox的构造函数确实是const类型,但你直接写SizedBox()时,默认生成的是普通运行时实例,等价于省略了new关键字的new SizedBox()。只有当这个实例处在必须传入常量的上下文中时,才会隐式转为常量,比如你把它放在const <Widget>[]数组里、或者作为const变量的初始化值时,不需要手动写const也会按常量处理。 - 显式加
const的作用:
编译期就会创建唯一的常量实例,整个程序运行过程中所有同参数的const SizedBox()都会指向同一块内存地址,不会重复创建对象,既减少内存占用,也能降低GC压力。你可以通过下面的代码验证差异:void main() { var a = SizedBox(); var b = SizedBox(); print(a == b); // 输出 false,两个独立的运行时实例 var c = const SizedBox(); var d = const SizedBox(); print(c == d); // 输出 true,同一个常量实例 } - 编辑器的提示来自Dart官方的
prefer_const_constructorslint规则,目的就是提醒开发者在可以使用常量的场景主动声明,最大化利用const的性能优势。
内容的提问来源于stack exchange,提问作者Hannes Hultergård
相关产品推荐
相关产品推荐

