只是一个理论性的问题,但我找不到一个好的答案:
如果我通过ref传递一个参数,则传递的是对象本身而不是副本。
这就是让我感到困惑的地方:据我所知,每个方法都有自己的堆栈帧 - 内存,它们不能离开。那么,这是否意味着一个 ref - Object 被打包在堆上并且有一个对此参数的引用,或者该方法进入调用方法的堆栈并在那里工作?
如果我的问题令人困惑,我很抱歉,我基本上想知道 ref 类型如何保存以及它对其产生的影响。
注: 我认为我没有表达清楚。我了解值类型和引用类型的概念。为了简单起见,我尝试仅通过一个值类型来解释它,比如 Int:
过程 1 通过 ByVal 调用 Prodecure 2 传递一个 Int。这个 int 在 Prodecure 2 的堆栈上有自己的内存,这意味着在 P2 中更改此值并不会更改 P1 中的值,因为这两个值各自保存在堆栈中一次。
现在同样是通过 ByRef:Prodecure 2 不保存 Int 的副本,而是直接访问此值。使其工作有(在我看来)两种可能性:
1. int 被打包在堆上,并且实际上有 2 个指向此 Int 的指针,但由于它现在在堆上,因此值更改在两个过程中都可以看到。
2. P2 在某种程度上可以访问 P1 的堆栈,这是我认为不可能的,因为这意味着堆栈生命周期没有固定。
这样是否能更清楚地表达我的意思?
如果我通过ref传递一个参数,则传递的是对象本身而不是副本。
这就是让我感到困惑的地方:据我所知,每个方法都有自己的堆栈帧 - 内存,它们不能离开。那么,这是否意味着一个 ref - Object 被打包在堆上并且有一个对此参数的引用,或者该方法进入调用方法的堆栈并在那里工作?
如果我的问题令人困惑,我很抱歉,我基本上想知道 ref 类型如何保存以及它对其产生的影响。
注: 我认为我没有表达清楚。我了解值类型和引用类型的概念。为了简单起见,我尝试仅通过一个值类型来解释它,比如 Int:
过程 1 通过 ByVal 调用 Prodecure 2 传递一个 Int。这个 int 在 Prodecure 2 的堆栈上有自己的内存,这意味着在 P2 中更改此值并不会更改 P1 中的值,因为这两个值各自保存在堆栈中一次。
现在同样是通过 ByRef:Prodecure 2 不保存 Int 的副本,而是直接访问此值。使其工作有(在我看来)两种可能性:
1. int 被打包在堆上,并且实际上有 2 个指向此 Int 的指针,但由于它现在在堆上,因此值更改在两个过程中都可以看到。
2. P2 在某种程度上可以访问 P1 的堆栈,这是我认为不可能的,因为这意味着堆栈生命周期没有固定。
这样是否能更清楚地表达我的意思?
ref
传递引用时,你传递的是对另一个引用的引用。这类似于指向指针的指针。你并没有传递相同引用的副本,那样会按值传递引用。 - Servy