在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?)
答案 0 :(得分:4)
Dart 2允许您在任何地方省略new
。现在,您曾经写过new
的任何地方都可以忽略它。
Dart 2还允许您在上下文所隐含的位置省略const
。这些职位是:
const
对象创建中,映射或列出文字(const [1, [2, 3]]
)。@Foo(Bar())
)中创建const对象const x = [1];
)的初始化表达式中。case Foo(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/const和Implicit Creation中找到更多详细信息。