Dart 2 中的 const 什么时候是可选的?
When is const optional in Dart 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?)
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 and Implicit Creation 中找到更多详细信息。
Dart 2 允许您在任何地方省略 new
。以前写new
的地方,现在可以省略了。
Dart 2 还允许您在上下文暗示的位置省略 const
。这些职位是:
- 在
const
个对象创建中,映射或列表文字 (const [1, [2, 3]]
)。
- 在元数据中创建 const 对象 (
@Foo(Bar())
)
- 在常量变量 (
const x = [1];
) 的初始化表达式中。
- 在 switch case 表达式中 (
case Foo(2):...
)。
还有两个其他位置,语言需要常量表达式,但不会自动成为常量(出于各种原因):
- 可选参数默认值
- 类 中带有
const
构造函数的最终字段的初始化表达式
1 未设为常量,因为我们希望保留选项,使这些表达式将来不需要设为常量。 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?)
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 and Implicit Creation 中找到更多详细信息。
Dart 2 允许您在任何地方省略 new
。以前写new
的地方,现在可以省略了。
Dart 2 还允许您在上下文暗示的位置省略 const
。这些职位是:
- 在
const
个对象创建中,映射或列表文字 (const [1, [2, 3]]
)。 - 在元数据中创建 const 对象 (
@Foo(Bar())
) - 在常量变量 (
const x = [1];
) 的初始化表达式中。 - 在 switch case 表达式中 (
case Foo(2):...
)。
还有两个其他位置,语言需要常量表达式,但不会自动成为常量(出于各种原因):
- 可选参数默认值
- 类 中带有
const
构造函数的最终字段的初始化表达式
1 未设为常量,因为我们希望保留选项,使这些表达式将来不需要设为常量。 2 是因为它是一个非局部约束——周围没有任何东西表示它必须是常量的表达式,所以它太容易了,例如,从中删除 const
构造函数没有注意到它改变了字段初始值设定项的行为。