Dart 省道-整数的传递值,但列表的引用?
在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;
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的值,但是当您复制一个列表时,您复制了对列表的引用。现在您有两个引用,但它们引用的是同一个列表。另请参见: