C#类引用类型

时间:2019-06-07 11:10:52

标签: c# reference-type

我对引用类型实际上如何工作有疑问。 我有一个具有两个属性Name和Age的Person类。我正在创建一个Person类的对象(objPerson1),为这两个属性分配一些值,并将该对象分配给另一个Person类型的对象(objPerson2)。现在的问题是分配后,当我更改Name和Age属性并打印它们时,两个对象共享相同的Name和Age,这与它们是引用类型一样好。但是当我为对象本身分配null值时,其他对象不会得到无效。下面是代码

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public static void Main(string[] args)
{
    Person objPerson1 = new Person();
    objPerson1.Name = "Tom";
    objPerson1.Age = 10;

    Person objPerson2 = objPerson1;
    objPerson2.Name = "Jerry";
    objPerson2.Age = 15;
    Console.WriteLine($" Person1-{objPerson1.Name},{objPerson1.Age} and Person2-{objPerson2.Name},{objPerson2.Age}");
    //Above line prints   Person1-Jerry,15 and Person2-Jerry,15
    //which is right as both are sharing same address.But when I wrote following code it confused me alot.
}

public static void Main(string[] args)
{
    Person objPerson1 = new Person();
    objPerson1.Name = "Tom";
    objPerson1.Age = 10;
    Person objPerson2 = objPerson1;
    objPerson2 = null;
    //After executing above line objPerson2 was null but objPerson1 were still having the values for Name and Age.
}

由于它们是引用类型,并且如果我为objPerson2指定null时都指向相同的地址,则objPerson1也应该为null,反之亦然。如果我错了,请纠正我

2 个答案:

答案 0 :(得分:4)

有点简化,但希望足以让您理解:

Person objPerson1 = new Person();

堆:为对象分配的内存

堆栈:objPerson1 =堆对象的地址

objPerson1.Name = "Tom";
objPerson1.Age = 10;

堆:正在填充值。

堆栈:不变(仍然相同的地址)

Person objPerson2 = objPerson1;

堆栈:另一个变量获取相同的地址

堆:不变

objPerson2 = null;

堆栈:变量objPerson2获得值0x00000000

请注意,objPerson1仍然具有堆的地址,并且堆上的对象仍然存在。因此objPerson1仍然“有效”。

答案 1 :(得分:-1)

rbx=&L2只是指向@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = { SpringBootApplication.class }) public class ControllerTest { ... 初始化分配的内存的指针。为objPerson2分配null会删除该指针。 objPerson1仍指向该内存,直到它拥有它的值,并且一旦objPerson2就指向该内存。