gpt4 book ai didi

c# - 当按值传递作为引用返回时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 05:56:48 25 4
gpt4 key购买 nike

好的,在你站起来之前,你需要了解什么是按值传递和按引用传递。您可能不同意按值传递的定义,但这只是语义,因为真正的问题是堆栈分配和堆分配之间发生的情况。

按值传递:复制要传递的对象,并将该对象的副本作为参数提交给函数(好吧,OO 纯粹主义者您喜欢将其称为“方法” - 语义!)。因此,在函数结束/返回时,无论对对象的副本做了什么,原始对象都不会被修改。

因此 Java(大概还有 C#)是一种按值传递语言。有些人认为它们是通过引用传递的,但实际上传递的参数是引用。因此引用的副本被传递给函数。也就是说,引用是按值传递的 arg,因为原始引用在函数结束/返回时不会更改。

既然我们已经解决了这个问题,并且开始接受我对值传递的定义,那么问题就在这里。

因此函数参数是原始对象/引用的副本。它是在堆栈上分配的。堆栈很好,因为分配的值在函数结束/返回时会被简单且立即丢弃。当我的函数从堆栈中获取按值传递参数并返回它时会发生什么。看,它在堆栈上。该对象/引用的堆栈分配是否被复制并重新分配到堆上?

Java 和 C# 中到底发生了什么?

最佳答案

听起来你是在问这样的东西在 Java 中的效果是什么:

public static void f(Object object) {
return object;
}

public static void g() {
Dog dog = new Dog("Spike");
System.println(f(dog));
}

如果是这样,答案是,当 g 被调用时:

  1. 内存在堆上分配,g 中一个名为dog 的堆栈分配变量用于引用该内存。 Dog 的“值”是对该对象的引用;它占用一个单词的内存。

  2. 该值的副本通过寄存器或在堆栈上传递给 f。 f 拥有自己的堆栈帧,除非被编译器优化掉。但假设它确实获得了一个堆栈帧。包含地址副本值的简单字被放置在该堆栈帧中。实际上,这与以某种方式传递普通的旧整数没有什么不同,正如您正确指出的那样,Java 中的所有内容都是按值传递的。

  3. 当 f 返回时,它将 object 的值传递给其调用者,该值本身只是指向原始 Dog 对象的内存字。这个简单的指针值通常通过寄存器传回。重点是,只传回了一个字。

关于c# - 当按值传递作为引用返回时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com