5

我正在阅读关于 SO 的这个答案,我想知道为什么这些字段被显式声明为静态和常量。Dart 中的 const 字段是编译时间常量吗?如果是这样,这是否意味着它们是隐式静态的?

4

1 回答 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 回答