7

在 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?)
4

2 回答 2

9

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

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

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

还有另外两个语言需要常量表达式的地方,但它们不会自动变为常量(出于各种原因):

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

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

于 2018-10-01T09:41:57.267 回答
5

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中找到更多详细信息。

于 2018-09-30T19:23:47.727 回答