Dart - 按 int 值传递但对列表引用?

fen*_*y3d 7 dart

在 Dart 中,查看下面的代码,它是否对列表“按引用传递”,对整数“按值传递”?如果是这种情况,什么类型的数据将通过引用/值传递?如果不是这种情况,导致这种输出的问题是什么?

void main() {
  var foo = ['a','b'];
  var bar = foo;
  bar.add('c');
  print(aoo); // [a, b, c]
  print(bar); // [a, b, c]
  
  var a = 3;
  int b = a;
  b += 2;
  print(a); // 3
  print(b); // 5
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 8

您提出的问题可以通过查看值和引用类型之间的差异来回答。

像几乎所有其他编程语言一样,Dart 对两者进行了区分。这样做的原因是您将内存分为所谓的堆栈和堆。堆栈速度很快,但非常有限,因此它无法容纳那么多数据。(顺便说一句,如果堆栈中存储了太多数据,您将收到堆栈溢出异常,这就是该站点名称的来源;))。另一方面,堆速度较慢,但​​可以容纳几乎无限的数据。

这就是为什么有值类型和引用类型。值类型是所有原始数据类型(在 Dart 中所有写得较小的数据类型int,如booldouble等)。它们的值足够小,可以直接存储在堆栈中。另一方面,您拥有可能更大的所有其他数据类型,因此它们无法存储在堆栈中。这就是为什么所有其他所谓的引用类型基本上都存储在堆中,而只有地址或引用存储在堆栈中。

因此,当您将引用类型设置bar为时foo,您实际上只是将存储地址从 复制barfoo。因此,如果您更改存储在该引用下的数据,则似乎您更改了两个值,因为两者具有相同的引用。相反,当您说b = a您不传输参考而是实际值时,因此如果您对原始值进行任何更改,则不会受到影响。

我真的希望我能帮助回答你的问题:)