You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:10:12