Dart 省道-整数的传递值,但列表的引用?

Dart 省道-整数的传递值,但列表的引用?,dart,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;

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

因此,当查看值和引用类型之间的差异时,可以回答您提出的问题

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

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

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


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

在Dart中,所有类型都是引用类型。所有参数都按值传递。引用类型的“值”是其引用。(这就是为什么可能有两个变量包含“同一个对象”——只有一个对象,但两个变量都包含对该对象的引用)。您永远不会仅仅通过传递引用来复制对象。 Dart没有将变量作为参数传递的“按引用传递”(因此被调用的函数可以更改绑定到变量的值,如C#的
ref
参数)


Dart根本没有基本类型。但是(大警告),数字总是(假装)标准化的,因此程序中只有一个
1
对象。您不能创建不同的
1
对象。在某种程度上,它的行为类似于其他语言的基本类型,但它不是一种。您可以使用
int
作为
List
的类型参数,与Java中需要执行
List
不同,您可以询问
int
的标识,如
相同(1,2)
,你可以对整数调用方法,比如
1。hashCode

你实际上没有在这里传递任何东西。当你把一个变量的值复制到另一个变量时,你只复制了那个变量的值,没有其他的。当您复制一个int,一个原语时,您复制了int的值,但是当您复制一个列表时,您复制了对列表的引用。现在您有两个引用,但它们引用的是同一个列表。另请参见: