0

考虑这个飞镖代码:

T t = T() // id field defaults to null
List<T> list = List()..add(t);
t.id = '123';
print('${list.first.id}') // What's output?

我的问题是传递的项目是List被复制到List还是参考。
我遇到了这种歧义,因为我正在使用flutter_reduxwhere 一个 action 包含 class 的实例T。在 reducer 上,我将此T实例添加到我的状态中。稍后,在中间件中,我更新了 thist的 id。但令人惊讶id的是,状态字段(在本例中为列表)也发生了变化!所以我唯一的猜测是对象是通过引用传递的。这个假设正确吗?

4

1 回答 1

0

Dart 中的所有内容都是一个对象,因此您传递的任何内容都是通过引用传递的。

来自Dart 语言之旅

您可以放在变量中的所有内容都是对象,每个对象都是类的实例。偶数、函数和null是对象。所有对象都继承自Object该类。

可变/不可变对象

然而,可变对象和不可变对象之间是有区别的。有些对象是不可变的,因此无法修改,而可变对象可以修改。

不可变对象的一个​​例子是String对象。

可变对象的示例List就像您在示例中观察到的一样。

恒常性

Dart 还有另一种有趣的对象,如果你熟悉C++or C,你就会遇到这些。这些是编译时常量 ( const),并带有不变性的属性。任何对象都可以在创建时声明为 const,前提是被调用的构造函数已声明为 const。

如果您将 const 对象传递给期望可变对象的函数,请注意它们,因为尝试改变常量会导致运行时错误。

void modl(final List<int> l) {
  l.add(90);
  print(l);
}

void main() {
  List<int> l = const [1,2,3,4];
  modl(l); // Uncaught Error
  print (l);
}

运行上述程序将产生一个Uncaught Error因为l是编译时常量。

请参阅检测何时将 const 对象传递给对其进行变异的函数,在 Dart 中

于 2020-08-16T21:07:55.970 回答