在 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
to foo
你本质上只是复制存储地址bar
to foo
。因此,如果您更改存储在该引用下的数据,则似乎您更改了两个值,因为两者具有相同的引用。相反,当你说b = a
您不传输参考值,而是传输实际值,因此如果您对原始值进行任何更改,它不会受到影响。
我真的希望我能帮助回答你的问题:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)