欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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]
  }
}

核心要点:

  1. var a = 10;这种赋值语法的含义是a是指向一个内存对象10的引用(ref).
  2. var a = 10; var b=a; 则a,b都指向同一个内存对象,即引用同一个内存对象。但是a,b之间没有任何联系。
  3. 在2的情况下,修改a指向对象的值,b也会跟着改。(矛盾点也在这里!)
  4. 但是,Dart中不是所有的对象都可以修改的(mutable or immutable),其中number,String,bool等都是不可变类型,每次修改都是产生一个新的对象。而其他大部分对象都是mutable, 所以第3条的情况在面对immutable对象会表现不一致。

over!

相关标签: Dart