这是【Dart 教程系列第 49 篇】,如果觉得有用的话,欢迎关注专栏。

文章目录

  • 一:结论
  • 二:什么是值类型 ?
  • 三:什么是引用类型 ?
  • 四:值类型和引用类型的主要区别
  • 五:验证 Dart 中的值传递
  • 六:验证 Dart 中的引用传递

一:结论

根据情况来说 Dart 是值传递还是引用传递

  • 基础数据类型如 String、int 是值传递,即给传入函数内的形参赋值并不会改变外部变量的入参的值。
  • 对于对象 Class、List、Map、Set 等是引用传递。

结论有了,在说 Dart 是值传递还是引用传递之前,你要先明白基础的值类型和引用类型的概念和区别。

二:什么是值类型 ?

直接存储数据,只存储变量的值,多用于存储不经常改变的值。数据存储在栈上。

以下面两行代码简单解释一下什么意思,如下代码所示

  int a = 6;int b = a;

先在栈上给 a 分配内存空间,把 6 存到这个空间里,然后在栈上给 b 分配内存空间,再把 a 的值 10 复制到分配给 b 的内存空间里。

三:什么是引用类型 ?

存储数据的引用(内存地址),数据存储在堆中。

假如有一个 People 类,有以下两种声明的方式,如下代码所示

  People temp; // 此时只是声明了类,还没有实例化类People people = new People(); // 这里实例化了类

下面分情况解释以下这两种的区别。

第一种 People temp;,在声明一个类时,只是在栈中分配一小块内存用于存放地址,还没有分配堆上的内存空间。
第二种 People people = new People();,new 操作符会返回对象的内存地址,当实例化一个类时,会把实例分配给堆上的内存空间。

四:值类型和引用类型的主要区别

值类型和引用类型的区别有很多,并不是这篇博客的重点,这里我只说一个重要的区别。

值类型的参数传递不会影响到参数本身,每个变量保存了其本身的数据拷贝。而引用类型变量保存了其数据的引用地址,当两个变量引用了内存中的同一块地址时,参数传递时会影响到参数本身。

理论概念了解了,下面通过代码来验证 Dart 中的值传递和引用传递。

五:验证 Dart 中的值传递

先做一个值类型的测试,如下图所示

在 valueTypeTest 方法中,我们声明了一个 String 类型的变量 value,然后调用了 setValue 方法,更改了形参 value 的值,最后在 main 函数中调用了 valueTypeTest 方法,你觉得打印的结果是什么呢?

下面是控制台打印的结果截图。

可见外部变量 value 在调用了 setValue 后,方法形参的值改变了,但没有影响到外部入参的 value 的值,这就是 Dart 的值类型传递。

说句题外话,记得以前用 C# 的时候,如果你想把形参修改后的结果影响到入参,可以在形参前面加上 ref 参数,C# 真是优雅。

六:验证 Dart 中的引用传递

下面的是引用类型的测试,首先声明一个 People 类,类中有一个 name 的属性,如下代码所示

class People {String name;People({required this.name});
}

然后是测试代码,如下图所示

在 refTypeTest 方法中,我们声明了一个 People 类的实例 people 并赋值其 name 属性为 CSDN,然后调用了 setPeopleName 方法,更改了形参的 name 属性为 Allen Su,最后在 main 函数中调用了 refTypeTest 方法,你觉得打印的结果是什么呢?

下面是控制台打印的结果截图。

当在 setPeopleName 方法中修改了形参 name 属性的值时,也影响到了外部入参的 name 的值,这就是 Dart 的引用类型传递。

所以平常在用 List 列表时,如果用一个新的 List 接收传入的 List,对新的 List 修改数据也会影响到传入的 List,因为它们用的是同一个内存地址,验证如下

如果你想让新 List 的修改不影响到传入的 List,就要用到 Dart 中列表的深拷贝方式之 List.from ,验证如下

深拷贝后 temp 和 resList 分别指向了两个不同的内存地址,所以对 temp 列表的修改不会影响到 resList 了。

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


结束语

技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。

【Dart 教程系列第 49 篇】Dart 是值传递还是引用传递相关推荐

  1. 【Dart 教程系列第 21 篇】Dart 之 firstWhere 返回数组中第一个满足条件的元素

    这是[Dart 教程系列第 21 篇],如果觉得有用的话,欢迎关注专栏. Dart 返回数组中第一个满足条件的元素,用 firstWhere() 方法,源代码定义如下 E firstWhere(boo ...

  2. 【Dart 教程系列第 22 篇】Dart 之 lastWhere 倒序查找数组中第一个满足条件的元素

    这是[Dart 教程系列第 22 篇],如果觉得有用的话,欢迎关注专栏. Dart 倒序查找数组中第一个满足条件的元素,用 lastWhere () 方法,源代码定义如下 E lastWhere(bo ...

  3. 【Dart 教程系列第 19 篇】Dart 之 indexWhere、lastIndexWhere 返回数组中第一个满足条件的元素的索引

    这是[Dart 教程系列第 19 篇],如果觉得有用的话,欢迎关注专栏. Dart 返回数组中第一个满足条件的元素的索引,用 indexWhere() 方法或者 lastIndexWhere() 方法 ...

  4. 【Dart 教程系列第 28 篇】Dart中的 Map 和实体类的相互转换

    这是[Dart 教程系列第 28 篇],如果觉得有用的话,欢迎关注专栏. 首先声明一个实体类 class People {String name; // 姓名String area; // 地区Str ...

  5. 【Dart 教程系列第 10 篇】Dart 之 removeLast 删除数组的最后一个元素

    这是[Dart 教程系列第 10 篇],如果觉得有用的话,欢迎关注专栏. Dart 删除数组的最后一个元素,用 removeLast() 方法,该方法无参数,返回被删除对象. List<Stri ...

  6. 【Dart 教程系列第 6 篇】Dart 之 addAll 合并两个数组(向数组中一次添加多个元素)

    这是[Dart 教程系列第 6 篇],如果觉得有用的话,欢迎关注专栏. Dart 合并两个数组,或者说是向数组中一次添加多个元素,可以使用 addAll() 方法. 该方法无返回值,参数类型为 Ite ...

  7. 【Dart 教程系列第 9 篇】Dart 之 clear 清空数组

    这是[Dart 教程系列第 9 篇],如果觉得有用的话,欢迎关注专栏. Dart 清空数组用 clear() 方法,该方法无返回值,无参数. List<String> l1 = [&quo ...

  8. 【Dart 教程系列第 40 篇】Dart 之 trim,trimLeft,trimRight 字符串去除空格

    这是[Dart 教程系列第 40 篇],如果觉得有用的话,欢迎关注专栏. trim 源码如下所示 String trim(); 语法 去除字符串中左右两边的空格,注意不是去掉字符串中所有的空格.如果两 ...

  9. 【Dart 教程系列第 17 篇】Dart 之 every 判断数组中是否每个元素都满足指定的条件

    这是[Dart 教程系列第 17 篇],如果觉得有用的话,欢迎关注专栏. Dart 判断数组中是否每个元素都满足指定的条件用 every() 方法,源代码定义如下 bool every(bool te ...

最新文章

  1. 学生的新增mySQL文档_MySQL增删改查
  2. 《李宏毅机器学习特训营》免费开放!直播教学!
  3. go get 获取被墙依赖包解决方法
  4. VC++中的char,wchar_t,TCHAR(转载)
  5. python的线性链表_Python线性表——单链表-阿里云开发者社区
  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪
  7. 番石榴的ListenableFuture
  8. c语言数组的实验报告结果思考,第七章实验报告(数组实验)
  9. 关于微信小程序开发环境苹果IOS真机预览报SSL协议错误问题解决方案
  10. Android Studio新建项目出错如何解决
  11. 一分钟认识JAVA与Android的联系与区别
  12. WebServic调用天气预报服务
  13. C# Dictionary 使用;增加、移除的各种方法
  14. 高等代数——大学高等代数课程创新教材(丘维声)——2.6笔记+习题
  15. Jenkins 系列教程-史上最简单Jenkins教程,教你一天学会使用Jenkins利器
  16. MongoDB管理工具studio 3t ,解决到期问题
  17. 这内容感觉不咋滴,啊咧怎么就十万+了?
  18. Linux云计算虚拟化-KVM桌面虚拟化技术
  19. Linux系统(三) 系统基础
  20. 实验吧:天网管理系统

热门文章

  1. flask自定义返回response
  2. JavaScript原型与继承的秘密
  3. 最好的职业生涯规划的文章(一)
  4. canvas理解:一看就懂的save和restore
  5. WEB安全测试要点总结
  6. Sql 根据当前日期获取当天、周、月、季度、年的开始和结束时间
  7. java数组从小到大排序_JAVA数组从小到大排序代码
  8. Jsplumb基础教程(vue+jsplumb+d3)
  9. 传华为将抢先苹果首发卫星通信 ;1200亿亿次每秒,阿里上线世界第一智算中心;wxPython团队辟谣已死传闻|极客头条
  10. 龚胤全云栖大会_2018杭州·云栖大会