gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:31:06 27 4
gpt4 key购买 nike

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

最佳答案

没有区别,因为稍微夸张地说,没有“常量列表”。

在 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.
}

没有办法编写通用的 isConstant 函数来区分使用 const 创建的对象和使用 new 创建的对象。运行时系统在某处有一个由 const 创建的对象的列表(因为它需要将另一个 const Foo(1) 规范化为相同的值),但是值本身 不知道它是使用 const 表达式创建的。

列表文字与基于构造函数的对象创建略有不同,因为非常量文字是可变的,而常量文字则不是。相反,const 文字会创建一个类似于您使用 List.unmodifiable 创建的列表对象。同样,列表对象本身并不知道它是使用 const [...] 还是 List.unmodifiable([...]) 创建的,它只是知道它是具有一组特定值的不可修改的列表。

VM 实际上对 const 列表和不可修改列表使用相同的类(dart2js 对所有内容都使用 JS 数组,但将它们标记为固定长度和不可修改的相同方式)。编译器不必使用相同的类,它是如何实现 const 列表的实现细节,但它们只有一个不可修改列表的实现也就不足为奇了,其他任何东西都是浪费.

因此,const 列表对象和使用 List.unmodifiable 创建的列表之间没有区别。它们是同一实现类的实例。

(很明显,一个包含常量列表的常量变量可以用在其他常量表达式中,并且常量列表文字是规范化的,所以如果你写const [1]在程序的两个地方,它计算出相同的列表对象,但对象本身只是一个不可修改的列表)。

关于dart - const 列表和不可修改的列表有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65015226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com