gpt4 book ai didi

dart - 为什么Dart充当引用传递?

转载 作者:行者123 更新时间:2023-12-03 04:12:42 29 4
gpt4 key购买 nike

我知道dart就像Java一样按值传递,但是我不明白为什么在下面的示例中dart像按引用传递那样?

class A {
int y = 10;
}

class B {
List<A> list = [];
void add(A a) {
a.y = 20;
list.add(a);
}

void runtest() {
print(list[0].y);
}
}

void main() {
A a = A();
B b = B();
b.add(a);
print(a.y);
b.runtest();
}
结果将是
20
20
为什么当在(b)内的方法(add)中更改对象(a)的变量(y)时,同时也在main()内更改了对象(a)的变量(y)?

最佳答案

我认为您的困惑来自对变量和参数是什么以及按引用传递和按值传递的概念的误解。
Dart中的变量可以看作是对对象的引用。当将此变量作为方法的参数时,必须提供此引用的副本。因此,该方法无法更改此引用指向的对象。但是该方法确实可以访问对象本身,因为它获得了引用的副本。因此,当我们将变量赋给方法时,我们不会创建对象的副本。
Dart中的某些对象是不可变的(例如String,int,double等),因此方法将无法更改这些类型的对象的内部状态。因此,即使我们获得了对其中一些对象的引用的副本,也无法更改状态,因此我们看到了类似“按值传递”的行为。
但是,如果某个对象(例如List)能够更改其内部状态,则可以进行修改,例如将项目添加到List对象中。由于我们从不创建新对象,因此我们将在方法之外看到此更改,因为我们对对象本身进行了更改,而对引用没有任何更改。这提供了您在示例中看到的“按引用传递”行为。
但这并没有改变以下事实:变量本身是一个引用,当将其作为参数提供给方法时,该引用总是“按值传递”。
可以在此处看到一个小示例,该示例显示了当我们谈论方法的参数时“按值传递”的含义。

class A {
int value;

A(this.value);
}

void main() {
final a = A(1);
print(a.value); // 1
myMethod(a);
print(a.value); // 1
}

void myMethod(A a) {
a = A(2);
}
如示例所示,可以将 a中的 myMethod变量更改为指向另一个对象,但是由于此变量是按值传递的,因此更改不会在 main中发生。

关于dart - 为什么Dart充当引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64080400/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com