在Dart中,“const”参数有什么区别?

6
3个回答

9

让我们考虑下面这三行代码:

1.const EdgeInsets.all(25.0)
2.const EdgeInsets.all(25.0)
3.const EdgeInsets.all(25.0)

1. 首先,EdgeInsets类创建一个新对象,并为其左、上、右、下分配值,并渲染给定的小部件,然后如果在另一个地方找到具有相同值的常量对象,则创建一个具有相同值的常量对象以进行渲染。

2. 嘿,已经有一个具有这个值的对象了,所以只需渲染它即可。

3. 嘿,已经有一个具有这个值的对象了,所以只需渲染它即可。

现在,让我们考虑这些场景:

1.EdgeInsets.all(25.0)
2.EdgeInsets.all(25.0)
3.EdgeInsets.all(25.0)

1. 在第一行中,EdgeInsets类创建一个新对象并为其左、上、右、下赋值,然后呈现给定的小部件。

2. 在第二行中,EdgeInsets类创建一个新对象并为其左、上、右、下赋值,然后呈现给定的小部件。

3. 在第三行中,EdgeInsets类创建一个新对象并为其左、上、右、下赋值,然后呈现给定的小部件。

因此,通过使用const关键字,我们可以减少每次重新创建相同对象所需的时间,并且在需要时重复使用它。


1
"const"在Dart中的含义有些复杂和微妙。const用于修改。您可以在创建集合时使用它,例如const [1, 2, 3],以及在构造对象(而不是new)时使用它,例如const Point(2, 3)。这里,const表示对象的整个深层状态可以完全在编译时确定,并且该对象将被冻结并完全不可变。
常量对象具有一些有趣的属性和限制: 它们必须从可以在编译时计算的数据中创建。常量对象没有访问任何需要在运行时计算的内容。1 + 2是一个有效的const表达式,但new DateTime.now()则不是。 它们是深度、传递性不可变的。如果您有一个包含集合的final字段,那么该集合仍然可以是可变的。如果您有一个const集合,则其中的所有内容也必须是const,递归地。 它们是规范化的。这有点像字符串插入: 对于任何给定的const值,将创建并重用单个const对象,无论如何评估const表达式。换句话说:"

源代码在这里


0

const 表示对象的(填充在此)整个深度状态可以完全在编译时确定,并且填充将被冻结并完全不可变。

PS:请阅读注释以获得更好的解释。


1
const 并不会使对象变为不可变。使用 new EdgeInsets.all(25.0) 创建的对象(带或不带字面量 new)同样是不可变的。相反,const 确保对象是不可变的(您不能犯错误并意外地创建一个可变对象),并且它将对象规范化,因此所有形式的表达式 const EdgeInsets.all(25.0) 都会计算为完全相同的对象。如果您在许多地方使用相同的值,则可以节省一些内存,而无需创建全局变量来共享该对象。 - lrn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接