类 如何在 .NET 中通过引用传递?

How can classes be passed by reference in .NET?

众所周知,.NET 中的 类 是按引用传递,按值传递结构。

在不安全代码中,您可以拥有指向结构的指针,但不能指向 类,因为它们会被 GC 移动。例如,当你有一个指向数组的指针时,你必须将它放在 fixed 语句中(如果你在堆上分配)或 stackalloc (在堆栈上分配)。

话虽如此,如果类被GC移动,怎么可能通过引用传递?

您可以将 class 类型实例视为一个句柄,那么对句柄的引用将只是一个间接寻址(一种指向句柄的指针)范围有限 通过方法调用。由于对象本身仍然隐藏在句柄后面,因此可以在没有任何可见效果的情况下重新定位它。

GC 移动了什么; GC 固定。由于 GC 无论如何都必须 找到 对一个对象的所有引用(以查看它是否可以进行 GC),因此这是 更改 那些的一个小额外步骤指向新地址的引用。