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

问题描述 投票:4回答: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?)
dart dart-2
2个回答
4
投票

Dart 2允许你在任何地方省略new。你以前在任何地方写new,你现在可以省略它。

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

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

还有另外两个位置,语言需要常量表达式,但不会自动变为常量(由于各种原因):

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

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


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找到更多细节。

© www.soinside.com 2019 - 2024. All rights reserved.