【发布时间】:2014-04-16 16:17:45
【问题描述】:
这只是一个理论问题,但我无法得到一个好的答案:
如果我通过ref 传递参数,则传递对象本身而不是副本。
这让我感到困惑:据我所知,每个方法都有自己的堆栈帧 - 内存,它们无法离开。那么这是否意味着 ref - Object 被打包在堆上并且有对该参数的引用,或者该方法是否进入调用方法的堆栈并在那里工作?
如果我的问题令人困惑,我很抱歉,我基本上想知道如何保存 ref 类型以及它有什么影响。
伊迪丝: 我想我没有说清楚。我理解值和引用类型的概念。为了方便起见,我试着用一个值类型来解释它,比如说 Int:
过程 1 通过传递一个 Int ByVal 调用 Prodecure 2。这个 int 在 Prodecure 2 的 Stack 上有自己的内存,这意味着,改变 P2 中的这个值不会改变 P1 中的值,因为这 2 个值在每个 Stack 中保存一次。
现在与 byref 相同:Prodecure 2 不保存 Int 的副本,但可以直接访问该值。 (在我看来)有两种可能使这项工作:
- int 被打包在堆上,实际上有 2 个指针 这个 Int,但由于它现在在堆上,因此可以看到值的变化 在这两个 Prodecures 上。
- P2 可以通过某种方式访问 P1 的堆栈,这 我想,这是不可能的,因为这意味着, Stone 中未设置堆栈生命周期。
这是否更清楚我的意思?
【问题讨论】:
-
对象本身没有被传递,对象的引用被传递。按价值。在堆栈上或在寄存器中或通过其他一些实现细节。
-
@Rahul 不,实际上。当您通过
ref传递引用时,您传递的是对引用的引用。这类似于指向指针的指针。您没有传递相同引用的副本,而是按值传递引用。 -
@Servy,不清楚。比如说,我的对象
obj在堆地址0xxab中。那么当你通过 ref 时,你实际上传递了相同的地址.. 对吗? (或)它通过另一个引用说0xxdm,它指向0xxab。 -
@RoyiNamir 是的。正如我从一开始就说过的,通过引用传递引用是将引用传递给存储引用的位置,而不是复制引用的值。当您按值传递引用时,您会复制引用的值。
标签: c#