Dart 2 中的 const 什么时候是可选的?

When is const optional in Dart 2?

在 Dart Object() 构造函数中声明为 const 所以:

identical(const Object(), const Object()); //true

我知道在 Dart 2 中关键字 const 是可选的,我认为前面的语句等同于:

identical(Object(), Object()); //false

但实际上它似乎等同于:

identical(new Object(), new Object()); //false

现在我的疑惑是:

1) const 关键字什么时候可选?

2) 有什么方法可以确保我的 类 的实例在没有 const 关键字的情况下始终保持不变?这样我就可以获得:

indentical(MyClass(), MyClass()); //true (is it possible?)

constconst 上下文 中是可选的。基本上,当表达式必须是 const 以避免编译错误时,会创建一个 const 上下文

在下面的代码片段中,您可以看到 const 是可选的地方:

class A {
  const A(o);
}

main(){
  // parameters of const constructors have to be const
  var a = const A(const A());
  var a = const A(A());

  // using const to create local variable 
  const b = const A();
  const b = A();

  // elements of const lists have to be const
  var c = const [const A()];
  var c = const [A()];

  // elements of const maps have to be const
  var d = const {'a': const A()};
  var d = const {'a': A()};
}

// metadatas are const
@A(const A())
@A(A())
class B {}

您可以在 Optional new/const and Implicit Creation 中找到更多详细信息。

Dart 2 允许您在任何地方省略 new。以前写new的地方,现在可以省略了。

Dart 2 还允许您在上下文暗示的位置省略 const。这些职位是:

  • const 个对象创建中,映射或列表文字 (const [1, [2, 3]])。
  • 在元数据中创建 const 对象 (@Foo(Bar()))
  • 在常量变量 (const x = [1];) 的初始化表达式中。
  • 在 switch case 表达式中 (case Foo(2):...)。

还有两个其他位置,语言需要常量表达式,但不会自动成为常量(出于各种原因):

  1. 可选参数默认值
  2. 类 中带有 const 构造函数的最终字段的初始化表达式

1 未设为常量,因为我们希望保留选项,使这些表达式将来不需要设为常量。 2 是因为它是一个非局部约束——周围没有任何东西表示它必须是常量的表达式,所以它太容易了,例如,从中删除 const构造函数没有注意到它改变了字段初始值设定项的行为。