【发布时间】:2013-06-08 14:56:17
【问题描述】:
我正在阅读关于 SO 的this answer,我想知道为什么这些字段被显式声明为静态和常量。 Dart 中的 const 字段是编译时间常量吗?如果是这样,这是否意味着它们是隐式静态的?
【问题讨论】:
我正在阅读关于 SO 的this answer,我想知道为什么这些字段被显式声明为静态和常量。 Dart 中的 const 字段是编译时间常量吗?如果是这样,这是否意味着它们是隐式静态的?
【问题讨论】:
理论上,您可以更改 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.
【讨论】: