之前看到有个文章url说是传值,我读了一些资料,觉得是错误的!正确的答案是引用。
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://stackoverflow.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!
本文探讨了Dart语言中值类型与引用类型的传递机制,通过具体实例对比了基本类型如num和String与复合类型如List和Class实例在函数调用前后的变化,解释了变量赋值与对象引用的概念。
2278

被折叠的 条评论
为什么被折叠?



