没有什么区别,因为稍微夸张的是,没有“const list”。
在 Dart 中,常量不是值的属性,而是表达式的属性。
例子:
class Foo {
final int x;
const Foo(this.x);
}
main() {
var foo1 = const Foo(1);
var foo2 = new Foo(1);
print(isConstant(foo1)); // cannot be done.
}
Run Code Online (Sandbox Code Playgroud)
没有办法编写一个通用isConstant
函数来区分使用创建的对象const
和使用创建的对象new
。运行时系统在某处有一个由 const 创建的对象的列表(因为它需要将另一个对象规范化const Foo(1)
为相同的值),但该值本身并不知道它是使用表达式创建的const
。
列表文字与基于构造函数的对象创建略有不同,因为非常量文字是可变的,而常量文字则不然。相反,该const
文字创建一个列表对象,类似于您使用创建的列表对象List.unmodifiable
。同样,列表对象本身不知道它是否是使用const [...]
or创建的List.unmodifiable([...])
,它只知道它是一个具有一组特定值的不可修改列表。
VM 实际上对 const 列表和不可修改列表使用相同的类(dart2js 对所有内容都使用 JS Array,但确实以与固定长度和不可修改相同的方式标记它们)。编译器不必使用相同的类,它是如何const
实现列表的实现细节,但它们只有一种不可修改列表的实现也不足为奇,其他任何东西都会浪费。
因此,const 列表对象和使用 创建的列表没有区别List.unmodifiable
。它们是同一实现类的实例。
(显然,保存常量列表的常量变量可以在其他常量表达式中使用,并且常量列表文字是规范化的,因此如果您const [1]
在程序中编写两个位置,它的计算结果将是相同的列表对象,但该对象本身只是一个不可修改的列表)。
归档时间: |
|
查看次数: |
1241 次 |
最近记录: |