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

Dart真的是100%纯面向对象语言吗?为何数值传参未被修改?

为什么Dart中传入函数的基本类型数值无法被修改?

先纠正核心误解:Dart的参数传递是按值传递

很多人会误以为Dart是引用传递,但实际上Dart采用的是按值传递:当你把一个变量传给函数时,传递的是这个变量当前值的副本——如果变量是对象类型(包括int、double这些基本类型),传递的就是对象引用的副本。

分析你的代码为什么不生效

先看你的代码:

void main() {
  double number = 44;
  print('before $number');
  changeNumber(number); // 这样不会输出45
  // number++; 这样会输出45;
  print('after $number');
}

void changeNumber(double number) => number++;

执行流程是这样的:

  1. main里的number变量指向一个值为44的不可变double对象。
  2. 调用changeNumber时,把main中number的引用副本传给函数的number参数——此时函数里的number和main里的number是两个不同的变量,但暂时指向同一个44对象。
  3. 函数里的number++本质是:创建一个值为45的新double对象,然后让函数里的number参数指向这个新对象。但这只会改变函数内部参数的指向,main里的number仍然指向原来的44对象,所以输出还是44。
  4. 而如果直接在main里写number++,是直接让main的number变量指向新的45对象,所以输出会变。

为什么要这么设计?

原因主要有两点:

  • 不可变对象的安全性:int、double、String这类基本类型都是不可变对象,任何修改操作都会返回新对象。这种设计能避免意外的副作用——如果基本类型可变,传递到函数后被修改,会导致调用方的变量莫名其妙变化,排查bug难度陡增。
  • 兼顾面向对象与性能:把基本类型设计成对象,符合Dart纯面向对象的特性;同时按值传递引用副本+不可变的设计,既保留了值类型的可预测性,又不会带来额外的性能开销(因为不可变对象可以被安全共享)。

内容的提问来源于stack exchange,提问作者Manish Raj Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:32:08