【发布时间】:2011-09-30 03:41:30
【问题描述】:
好的,在你跳起来之前,你需要了解什么是 pass-by-value 与 pass-by-ref 相比。您可能不同意按值传递的这种定义,但这仅仅是语义,因为真正的问题是堆栈分配和堆分配之间发生了什么。
按值传递:复制要传递的对象,并将对象的副本作为参数提交给函数(好的,OO 纯粹主义者喜欢将其称为“方法”-语义!)。因此,在函数的结束/返回时,无论对对象的副本做了什么,原始对象都不会被修改。
所以 Java(可能还有 C#)是一种按值传递的语言。有些人认为它们是传递引用,但实际上传递的参数是引用。所以引用的副本被传递给函数。也就是说,引用是按值传递的 arg,因为原始引用在函数结束/返回时没有改变。
既然我们已经解决了这个问题,并且开始接受我的值传递定义,那么问题来了。
因此,函数参数是原始对象/引用的副本。它在堆栈上分配。堆栈很好,因为分配的值在函数结束/返回时被简单地立即丢弃。当我的函数从堆栈中获取按值传递的 arg 并将其返回时会发生什么。看,它在堆栈上。该对象/引用的堆栈分配是否被复制并重新分配到堆上?
在 Java 和 C# 中究竟/准确地发生了什么?
【问题讨论】:
标签: c# java pass-by-value