Dart 2 中的 const 何时是可选的?
Posted
技术标签:
【中文标题】Dart 2 中的 const 何时是可选的?【英文标题】:When is const optional in Dart 2? 【发布时间】:2019-03-05 23:24:23 【问题描述】:在 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?)
【问题讨论】:
【参考方案1】:Dart 2 允许您在任何地方省略 new
。以前写new
的地方,现在可以省略了。
Dart 2 还允许您在上下文暗示的位置省略 const
。这些职位是:
const
对象内创建、映射或列表文字 (const [1, [2, 3]]
)。
在元数据中创建 const 对象 (@Foo(Bar())
)
在 const 变量 (const x = [1];
) 的初始化表达式中。
在 switch case 表达式中 (case Foo(2):...
)。
语言还有两个地方需要常量表达式,但它们不会自动变为常量(出于各种原因):
-
可选参数默认值
具有
const
构造函数的类中最终字段的初始化表达式
1 没有被设为 const,因为我们希望保留让这些表达式在未来不需要成为 const 的选项。 2 是因为它是一个非局部约束 - 周围 表达式中没有任何东西表明它必须是 const,因此很容易,例如,从构造函数中删除 const
而没有注意到它改变了字段初始化器的行为。
【讨论】:
【参考方案2】:const
在 const 上下文中是可选的。基本上,当表达式必须为 const 以避免编译错误时,就会创建 const 上下文。
在下面的 sn-p 中你可以看到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 中找到更多详细信息。
【讨论】:
以上是关于Dart 2 中的 const 何时是可选的?的主要内容,如果未能解决你的问题,请参考以下文章
Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]