Dart列表传参两类示例差异原因及值/引用传递疑问
Dart中列表传递机制的差异解析:值传递与引用的区别
核心结论
Dart是严格的按值传递语言,但对于列表、类实例这类对象,传递的是对象引用的副本——这就是两个示例表现不同的根本原因。
示例1分析:修改共享对象的内部状态
void update(List<String> list) { list.add('C'); } void main() { List<String> list=['A','B']; print('Before'+list.toString()); update(list); print('after'+list.toString()); } // 输出:Before[A, B] after[A, B, C]
main函数中的list变量存储的是指向堆上列表对象的引用。调用update时,这个引用的副本被传给函数的参数list。此时,两个list变量(main里的和函数里的)指向同一个堆上的列表对象。调用add方法是直接修改这个共享对象的内部数据,所以main函数里的列表会同步更新。
示例2分析:重新赋值参数引用不影响外部
void update(List<String> list) { List<String> newList=['x','y']; list=newList; } void main() { List<String> list=['A','B']; print('Before'+list.toString()); update(list); print('after'+list.toString()); } // 输出:Before[A, B] after[A, B]
函数内的list = newList操作,只是把函数内部的参数变量list的引用,改成指向新创建的newList对象。但这个操作只修改了函数内部的引用副本,main函数里的原始list变量仍然指向原来的列表对象,所以外部列表没有变化。
值传递 vs 引用传递的清晰区分
- 值传递:传递的是变量值的副本。对于数值、布尔这类基本类型,传递的是值本身;对于对象(比如列表),传递的是对象引用的副本。函数内对参数变量的重新赋值,不会影响外部的原始变量。
- 引用传递:传递的是变量的内存地址,函数内对参数的重新赋值会直接修改外部变量。Dart并不支持这种传递方式。
官方文档参考途径
Dart官方核心文档中,《Functions》章节详细说明了参数传递的机制,《Object-oriented programming》部分也会讲解对象引用的相关概念,可以在Dart官网的核心指南中找到这些内容。
内容的提问来源于stack exchange,提问作者user22362195
相关产品推荐
相关产品推荐

