对于对象中的引用感到困惑

时间:2009-08-26 22:25:49

标签: c#

我对对象关系感到困惑! 我有两个班的人和地址。以下是详细信息:

 public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        private List<Address> _addresses = new List<Address>(); 

        public void AddAddress(Address address)
        {
            _addresses.Add(address);
            address.Person = this; 
        }

        public List<Address> Addresses  
        {
            get { return _addresses; }
            set { _addresses = value; }
        }
    }

  public class Address
    {
        public string Street { get; set; }


        public Person Person
        {
            get; set;
        }
    }

Person类中的AddAddress方法将地址添加到Addresses集合中,并为Address对象设置Person。现在,在代码中我执行以下操作:

var person = new Person() { FirstName = "John", LastName = "Doe" };
            person.AddAddress(new Address() { Street = "Blah Blah" });

            person.Addresses[0].Person = null; 

我认为它应该将person对象设置为null,因为Addresses [0] .Person指向原始person对象。但它没有将其设置为null。这里发生了什么?

4 个答案:

答案 0 :(得分:8)

  

这里发生了什么?

简单说明:

变量(在本例中为“Person”)为对象保留reference。在引擎盖下,这只是一个数字。将它指定为null时,您正在执行的操作就是停止指向该对象的变量。对象本身仍然存在。

- 编辑

了解其工作原理的一种方法是站在您的计算机附近,并指出它。您现在是一个变量,您的计算机是一个对象。现在停止指向计算机(放下手臂)。现在您是一个已分配null的变量。计算机仍然存在,没有任何改变,唯一的区别是你现在不再指向它了。

答案 1 :(得分:0)

Address.Person存储对象的引用。当您要求 Address.Person时,它将按照引用路径返回原始对象。当您设置 Address.Person时,您将使用新引用替换引用。在这种情况下,您将其设置为空或空引用。

答案 2 :(得分:0)

Address.Person只是对一个人的引用。将其设置为null将使Address类中的引用无效,但该人仍将存在。您创建的var(person)也只是一个引用,因此您不会将person变量置零。 当你将人物参考(person = null;)归零时,该人将被收集垃圾。

答案 3 :(得分:0)

当您调用AddAddress

时,会在代码中显式设置Address.Person值
public void AddAddress(Address address)        
{            
  _addresses.Add(address);
  address.Person = this;         
}

当您从列表中删除值时,您的代码中没有删除引用的位置。实际上,如果你要调用Person.Addresses.Count,你会发现它认为其中有更多的地址而不是实际存在(因为你将值设置为null而不是调用Person.Addresses.Remove(0);