Dart 2中const何时可选?

时间:2018-09-30 19:00:01

标签: dart 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?)

2 个答案:

答案 0 :(得分:4)

Dart 2允许您在任何地方省略new。现在,您曾经写过new的任何地方都可以忽略它。

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

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

语言还有另外两个需要常量表达式的位置,但由于某些原因它们不会自动变为常量:

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

1不是常量,因为我们希望保留使这些表达式将来不必常量的选项。 2是因为这是一个非局部约束-表达式周围没有 表示它必须为const,因此很容易例如从构造函数中删除const注意它会更改字段初始化程序的行为。

答案 1 :(得分:2)

const const上下文中是可选的。基本上,当表达式必须为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/constImplicit Creation中找到更多详细信息。