我正在学习有关引用类型,值类型,堆栈和堆以及它们之间差异的过程。通过引用传递值类型
现在我遇到了一些令我难以置信的东西。下面是一个代码示例来说明我的意思
void Main()
{
int foo = 0;
PassFoo(ref foo);
Console.WriteLine(foo);
}
void PassFoo(ref int bar)
{
bar = 1;
}
目前的情况是,现在的产量将1
只要我们使用裁判关键字。如果我们删除ref关键字,则输出将为0
。我明白,这是因为整数是值类型,当我们按值传递foo
我们正在复制由位取到bar
但是当我们添加裁判关键字我们,而不是只通过的foo
内存ADRESS在这个例子中,这也是我们改变foo
的原因的原因。我到目前为止是否正确?
...现在来混淆我的部分。我对堆栈工作原理的理解是,它只能访问当前正在运行的堆栈帧。这就是为什么PassFoo
无法直接访问foo
。我还了解到值类型存储在声明的位置。所以当我们通过foo
来引用时,我们将foo
的内存地址传递给bar
对不对?但PassFoo()
不应该不可访问,因为它在不同的堆栈框架中运行?
我意识到我可能不完全了解这是如何工作的,所以澄清将不胜感激。
变量仍处于嵌套的方法调用访问的,所以有与服用他们的地址没有问题。当您尝试在返回的方法中返回指向本地的指针时,会发生问题。 – Lee