值类型和引用类型问题

Ume*_*AKA 3 .net c# swap reference-type

嗨,我正在尝试做两个对象的简单交换.我的代码是

void Main()
{
  object First = 5;
  object Second = 10;

  Swap(First, Second);
  //If I display results it displays as 
  //Value of First as 5 and Second as 10
}

private static void Swap(object First, object Second)
{
  object temp = First;
  First = Second;
  Second = temp;
}
Run Code Online (Sandbox Code Playgroud)

由于对象是引用类型,因此应将其引用传递给方法,并且应该交换.为什么不发生?

Eri*_*ert 6

以这种方式看待它.

让我们将交换方法中的参数重命名为"x"和"y",因为它们与本地人相同只是令人困惑.

你有一个苹果和一个橘子.两个对象.

你有两张纸说"APPLE"和"ORANGE".这些是对象的引用.

你有两个盒子,一个标记为First,另一个标记为Second.

你把"APPLE"放在First中,把"ORANGE"放在第二位.

现在你再获得两个标有x和y的方框.

你制作APPLE的复印件并把它放在x中.你制作一张ORANGE的复印件并把它放在y里.

现在你交换x和y的内容.APPLE和ORANGE仍然是引用,但您没有更改First和Second的内容.你改变了x和y的内容.

现在假设您将"ref"添加到参数x和y的声明中.现在这意味着:

你有两个盒子,一个标记为First,另一个标记为Second.

你把"APPLE"放在First中,把"ORANGE"放在第二位.

您将新标签添加到第一个框; 它现在也可以称为x.第二个也可以称为y.

你交换了x和y的内容.由于它们只是First和Second的别名,因此交换First和Second的内容.

合理?


Mar*_*ell 5

这里有各种不同的东西:

  • 对象在堆中生活过.暂时忘掉它们吧
  • 对象引用是存储在First第二个中的内容
  • 你有两个变量Main
  • 你有两个参数Swap

现在; 重要的是"引用类型/引用"和"按引用传递"之间的区别.它们完全不相关.

在线:

Swap(First, Second);
Run Code Online (Sandbox Code Playgroud)

您通过两个变量的值Swap.在这种情况下,First/ Second参照装箱对象.

下一个;

private static void Swap(object First, object Second)
{
  object temp = First;
  First = Second;
  Second = temp;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您交换两个本地参数的值,但这些参数完全独立于其他任何参数.如果我们希望调用者看到的更改(即重新分配),我们需要通过引用传递:

private static void Swap(ref object First, ref object Second)
{
  object temp = First;
  First = Second;
  Second = temp;
}
Run Code Online (Sandbox Code Playgroud)

现在,值First不再是对盒装对象的引用; 它是对盒装对象的引用的引用.在来电者,我们使用:

Swap(ref First,ref Second);
Run Code Online (Sandbox Code Playgroud)

这意味着传递变量的引用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;
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,该x为1等,ref x是变量x的参考.在通过引用传递时,引用类型与值类型完全无关; 唯一重要的事情是理解与您传递的由默认的变量,其中的数值变量的是1(等),或者"对一个对象的引用".无论哪种方式,逻辑都是一样的.