首页 > 解决方案 > Dart 2 中的 const 何时是可选的?

问题描述

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

标签: dartdart-2

解决方案


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从构造函数中删除 而不注意到它改变了字段初始值设定项的行为太容易了。


推荐阅读