这里有各种不同的东西:
- 对象生活在堆中。暂时忘记他们
- 对对象的引用是存储在其中的
First
,其次是
- 你有两个变量
Main
- 你有两个参数
Swap
现在; 重要的是“引用类型/引用”和“按引用传递”之间的区别。它们是完全无关的。
在行中:
Swap(First, Second);
您将两个变量的值传递给Swap
. 在这种情况下,/的值是对装箱对象的引用。First
Second
下一个;
private static void Swap(object First, object Second)
{
object temp = First;
First = Second;
Second = temp;
}
在这里,您交换两个本地参数的值,但它们完全独立于其他任何参数。如果我们希望调用者看到值的变化(即重新分配),我们需要通过引用传递:
private static void Swap(ref object First, ref object Second)
{
object temp = First;
First = Second;
Second = temp;
}
现在的值First
不再是对装箱对象的引用;它是对装箱对象的引用。在调用方,我们使用:
Swap(ref First,ref Second);
这意味着传递变量的引用First
,而不是传递变量的值First
。
请注意,我说您可以忘记存在对象的事实?如果我们使用,上面的一切都是一样的:
int x = 1, y = 2;
Swap(ref x, ref y);
void Swap(ref int a, ref int b) {
var tmp = a; a = b; b = tmp;
}
唯一的区别是 的值为1x
等,并且ref x
是对变量 x 的引用。在按引用传递中,引用类型与值类型完全无关;唯一重要的是理解默认情况下传递变量的值,其中变量的值是1
(等),或“对对象的引用”。无论哪种方式,逻辑都是一样的。