我正在阅读关于 SO 的这个答案,我想知道为什么这些字段被显式声明为静态和常量。Dart 中的 const 字段是编译时间常量吗?如果是这样,这是否意味着它们是隐式静态的?
问问题
2377 次
1 回答
8
理论上,您可以更改 Dart 以使const
修饰符隐含static
. 这是一个有效的提议,并得到了积极的讨论。
我们更喜欢要求显式的原因有两个static
:
- 它使如何访问这些变量变得更加清晰(就像任何其他静态变量一样)。
- 我们可能想用实例
const
来表示不同的含义。目前,const
实例字段严格等同于final
字段。但是,它们不需要。例如,您可以更改 Dart 规范以允许访问const
实例字段作为常量表达式的一部分。(目前不允许访问字段右侧的const
字段。)
作为第二点的例子。假设你有:
class Point {
final int x;
final int y;
const Point(this.x, this.y);
}
const origin = Point(0, 0);
目前,您将无法编写:
const origin_x = origin.x;
可以更改规范以允许对常量对象的字段进行常量访问,但这会阻碍 const 类的发展。例如,将字段更改为 getter 会突然变成一个重大更改。
该const
提案标记了这些字段,从而允许在 const 上下文中访问它们。同时,该课程的作者知道更改字段(例如更改为 getter)将是一项重大更改。
class Point {
const int x;
const int y;
const Point(this.x, this.y);
}
const origin = Point(0, 0);
const origin_x = origin.x; // Now allowed.
于 2013-06-08T18:00:53.470 回答