Dart/Flutter中对象传值(by value)还是引用(by ref)
程序员文章站
2022-05-02 13:12:13
...
之前看到有个文章url说是传值,我读了一些资料,觉得是错误的!正确的答案是引用。
参考这篇文章 https://*.com/questions/54545977/dart-variable-store-reference-to-the-value
import 'dart:core';
class A{
int index = 0;
}
void setv_i(int a){
a += 1;
}
void setv_A(A a){
a.index += 1;
}
void main() {
// https://*.com/questions/54545977/dart-variable-store-reference-to-the-value
// operator = 是变量名对一个内存对象的ref。
// i 与 aa 表现不同是因为 num和String属于immutable类型,每次都是新建一个对象。
A aa = A();
print("old: A.index=${aa.index}");
setv_A(aa);
print("new: A.index=${aa.index}");
// 一个具有代表性的例子
{
var a = ['Apple', 'Orange'];
var b = a; // a,b ref to a some obj
a = ['Banana']; // Assignment, no impact to b, then a ref new obj
print(a); // [Banana]
print(b); // [Apple, Orange]
}
{
var a = ['Apple', 'Orange'];
var b = a;
a.clear(); // Mutation, the _list instance_ is changed, a's ref is same
a.add('Banana'); // Another mutation
print(a); // [Banana]
print(b); // [Banana]
}
}
核心要点:
-
var a = 10;
这种赋值语法的含义是a是指向一个内存对象10的引用(ref). -
var a = 10; var b=a;
则a,b都指向同一个内存对象,即引用同一个内存对象。但是a,b之间没有任何联系。 - 在2的情况下,修改a指向对象的值,b也会跟着改。(矛盾点也在这里!)
- 但是,Dart中不是所有的对象都可以修改的(mutable or immutable),其中number,String,bool等都是不可变类型,每次修改都是产生一个新的对象。而其他大部分对象都是mutable, 所以第3条的情况在面对immutable对象会表现不一致。
over!