Dart-为int传递值,但为list传递引用

  • 本文关键字:但为 list 引用 Dart- int 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
}

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

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

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

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

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

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

Dart根本没有原始类型然而(大警告(,数字总是(假装(规范化的,所以程序中只有一个1对象。不能创建不同的1对象。在某种程度上,它的作用类似于其他语言的基元类型,但它不是一种。您可以使用int作为List<int>的类型参数,这与Java中需要执行List<Integer>不同,您可以像identical(1, 2)一样询问int的身份,还可以对1.hashCode这样的整数调用方法。

如果要克隆或复制列表

var foo = ['a', 'b'];
var bar = [...foo];
bar.add('c'); 
print(bar);  // [a, b, c]
print(foo);  // [a, b]
var bar_two = []; //or init an empty list
bar_two.addAll([...bar]);
print(bar_two); // [a, b, c]

参考链接在Dart 中克隆列表、地图或集合

相关内容

最新更新