如何解决为什么Dart充当引用传递?
我知道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是按值致电。 值是对象引用。有时也称为"call by sharing"或“按对象引用调用”。它是按值调用...用于特定的值选择。
对象具有 identity ,这是面向对象编程的基本基石之一。因此,如果不复制成为新对象,就无法对其进行复制。这就是为什么面向对象的语言通常不将对象存储在变量中,而是存储对对象的引用。这些引用然后按值传递。
按值调用与按引用调用的不同之处在于,按引用调用传递了变量(也称为L值,即分配左侧的内容),而不是其值( R值)。通过引用调用可以创建局部变量,将其通过引用传递给另一个函数,然后让该函数更改绑定到该变量的值。 Dart无法做到这一点,它只能传递变量的值。
对象可以包含变量(实例变量,也称为字段),因此您可以将引用传递给包含变量(按值)的对象,这允许函数通过参数来改变 something ,但某些内容不能是局部变量。
,我认为您的困惑来自对变量和参数是什么以及按引用传递和按值传递的概念的误解。
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
中发生。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。