C#引用对象时正确的图是什么?

时间:2018-11-16 08:35:41

标签: c# asp.net .net

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        public class Todo
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        public static void ObjectSwap(ref Todo a, ref Todo b)
        {
            Todo taskTemp = a;
            a = b;
            b = taskTemp;
        }

        static void Main(string[] args)
        {
            Todo taskOne = new Todo{ Id = 1, Name = "One" };
            Todo taskTwo = new Todo{ Id = 2, Name = "Two" };

            ObjectSwap(ref taskOne, ref taskTwo);    
            Console.ReadKey();
        }
    }
}

有人可以告诉我这段代码的图吗?因为如果创建一个临时对象,我感到困惑,然后将其指向无论a指向哪个地址,然后将a的指针更改为b,然后将b更改为temp

像这样? Diagram A

OR

它不是更改地址而是地址的内容吗?

enter image description here

这两个中哪个看起来更合乎逻辑?我只想知道它是如何在后台运行的,它是更改指针还是引用还是更改引用内的内容...

编辑 这个怎么样?该代码的图表正确吗?

public static void swap(ref int a, ref int b)
{
    int temp = a; 
    a = b; 
    b = temp;     
}
static void Main(string[] args)
{
    int x = 1;
    int y = 2;

    swap(ref x, ref y);

    Console.WriteLine(x);
    Console.WriteLine(y);      

    Console.ReadKey();
}

Diagram C

那么更改数据而不是更改指针?

2 个答案:

答案 0 :(得分:3)

都不是。我们不复制 object (如两个图所示),并且最终不会出现具有相同标识的多个对象。

我们只有两个对象,它们是正好从左到右移动的箭头。

我用红叉划线了一些,并用蓝色添加了正确的箭头:

enter image description here

答案 1 :(得分:2)

仅因为我想绘制MSPaint,所以这是呈现信息的另一种方法。此图说明了Todo对象在内存中的位置和内容没有更改。但是我们确实有引用内存中特定地址的变量,并且它们引用的地址 do 在程序执行过程中会发生变化。

enter image description here