14

Dart 有编译时常量的概念。编译时常量在编译时被解析和创建,并被规范化。

例如,这是constPoint 的构造函数:

class Point {
  final num x, y;
  const Point(this.x, this.y);
}

以下是你如何使用它:

main() {
  var p1 = const Point(0, 0);
  var p2 = const Point(0, 0);
  print(p1 == p2); // true
  print(p1 === p2); // true
}

这是一个不明显的功能,似乎与其他动态语言中的功能没有相似之处。对象有一些限制const,比如所有字段都必须是 final 的,并且它必须有一个 const 构造函数。

为什么 Dart 有编译时常量?

4

2 回答 2

17

Florian Loitsch在邮件列表中写道:

编译时常量的规范化属性很好,但不是拥有它们的主要原因。编译时常量的真正好处是,它们不允许在构造时任意执行,因此可以在我们不想执行代码的地方使用。例如,静态变量初始化器最初仅限于编译时常量,以避免在顶层执行。简而言之,他们确保程序以“main”开头,而不是其他地方。

于 2012-09-14T05:49:54.293 回答
1

Lasse在这里的回答对我帮助很大

那么,编译时常量到底有什么用呢?

  • 它们对枚举很有用。
  • 您可以在 switch case 中使用编译时常量值。
  • 它们用作注释。

在 Dart 切换到惰性初始化变量之前,编译时常量曾经更重要。在此之前,您只能声明一个已初始化的全局变量,如“var x = foo;” 如果“foo”是编译时常量。如果没有这个要求,大多数程序都可以在不使用任何 const 对象的情况下编写

于 2018-06-14T01:48:05.403 回答