为了澄清,我问的是语言的设计决策以及编译器和执行器的内部工作原理。
在 Dart 中,从类创建 const 对象需要满足三个条件:
附注: 这个问题我自己来回答一下。但如果您能阅读我的答案并告诉我它是否错误或添加我不知道的信息,我将不胜感激
虽然不是我的问题的直接一部分,但我在下面附上了我为理解该问题的语言而进行的一系列测试: https://docs.google.com/document/d/1Y8IlOlzI5VGFLzLFlih1d7QgOdynUxvrF7Q3kd0OSwQ/edit?usp=sharing
我们知道 Dart 创建了不同的构造函数来创建 const 和非常量对象(即使内部标记为 const 的构造函数也有一个非常量副本)。当编译器遇到 const 对象创建时,它可以自己创建一个 const 构造函数,但这会导致冗余(时间和内存方面),因为与类的代码段内存分配有关的问题和预编译头文件。因此类本身最好将构造函数标记为 const 构造函数,因此规则 1.
对修改属性的限制以删除其 setter 方法的形式处理。方法对于类来说是通用的,并且不能在不创建类的不同版本的情况下区分 const 和非 const 对象。虽然,这很可能由编译器在内部实现,但 Dart 可能选择了利用现有机制的简单方法,这导致了规则 2。因为 Final 属性没有 setter 方法,所以无论该类是否有 const 构造函数.
对于规则 3, 我们想要为构造函数提供主体有两个原因:
当这两个用例都不适用时(并且这两种情况都需要额外的工作来实现,通常在语言中,构造函数主体在创建对象后执行),为什么还要允许主体?如果我们需要从对象运行某些东西,我们可以在运行时使用类方法(而不是构造函数)来完成