【发布时间】:2017-11-22 03:45:18
【问题描述】:
如果我通过引用传递一个引用类型,试图了解究竟发生了什么。我是这样理解的:
所以我有一个类 Foo,它代表一个引用类型
class Foo{ //Foo-stuff here }
所以就在这里
Foo f = new Foo();
Foo f(在堆栈上创建)保存实际对象的地址/引用,该对象在调用new Foo()时在堆中创建;
所以f 实际上拥有类似0x2A53BC 的东西
如果我调用一个方法来做这个
void Test(Foo g) { g = null; }
我只是传递“地址变量/引用变量”f 的地址。所以g 实际上指向堆栈中的f,而不是指向堆中的实际对象。所以我可以通过f更改堆中Foo对象的属性,因为我有f的地址,我可以通过f访问Foo,但是设置g=null只会杀死f变量的地址在堆栈中,而不是对堆本身中对象的引用。
但是有了这个
void Test(ref Foo g) { g = null; }
我实际上是在使用堆中那个 Foo-Object 的真实地址,所以使用 0x2A53BC。这意味着,我可以通过设置 g=null 来更改它指向的位置或终止从堆栈到堆的指针
这是对的吗?非常感谢!
【问题讨论】:
标签: c# pointers reference pass-by-reference