在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 2允许你在任何地方省略new
。你以前在任何地方写new
,你现在可以省略它。
Dart 2还允许您在上下文隐含的位置省略const
。这些职位是:
const
对象创建,地图或列表文字(const [1, [2, 3]]
)内。@Foo(Bar())
)const x = [1];
)的初始化表达式中。case Foo(2):...
)中。还有另外两个位置,语言需要常量表达式,但不会自动变为常量(由于各种原因):
const
构造函数的类中的final字段的初始化表达式1不是const,因为我们希望保留使这些表达式在将来不需要是const的选项。 2是因为它是一个非局部约束 - 表达式周围没有任何东西表示它必须是const,所以它太容易了,例如,从构造函数中删除const
而没有注意到它改变了字段初始化程序的行为。
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/const和Implicit Creation找到更多细节。