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++;
执行流程是这样的:
main里的number变量指向一个值为44的不可变double对象。- 调用
changeNumber时,把main中number的引用副本传给函数的number参数——此时函数里的number和main里的number是两个不同的变量,但暂时指向同一个44对象。 - 函数里的
number++本质是:创建一个值为45的新double对象,然后让函数里的number参数指向这个新对象。但这只会改变函数内部参数的指向,main里的number仍然指向原来的44对象,所以输出还是44。 - 而如果直接在
main里写number++,是直接让main的number变量指向新的45对象,所以输出会变。
为什么要这么设计?
原因主要有两点:
- 不可变对象的安全性:int、double、String这类基本类型都是不可变对象,任何修改操作都会返回新对象。这种设计能避免意外的副作用——如果基本类型可变,传递到函数后被修改,会导致调用方的变量莫名其妙变化,排查bug难度陡增。
- 兼顾面向对象与性能:把基本类型设计成对象,符合Dart纯面向对象的特性;同时按值传递引用副本+不可变的设计,既保留了值类型的可预测性,又不会带来额外的性能开销(因为不可变对象可以被安全共享)。
内容的提问来源于stack exchange,提问作者Manish Raj Yadav
相关产品推荐
相关产品推荐

