const 列表和不可修改列表有什么区别?

iDe*_*ode 2 dart

我无法在 const 列表和不可修改列表中添加/删除/修改元素。那么,如果两者都做同样的事情,那么两者之间有什么区别呢?

lrn*_*lrn 5

没有什么区别,因为稍微夸张的是,没有“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]在程序中编写两个位置,它的计算结果将是相同的列表对象,但该对象本身只是一个不可修改的列表)。