我对对象关系感到困惑! 我有两个班的人和地址。以下是详细信息:
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。这里发生了什么?
答案 0 :(得分:8)
这里发生了什么?
简单说明:
变量(在本例中为“Person”)为对象保留reference
。在引擎盖下,这只是一个数字。将它指定为null时,您正在执行的操作就是停止指向该对象的变量。对象本身仍然存在。
- 编辑
了解其工作原理的一种方法是站在您的计算机附近,并指出它。您现在是一个变量,您的计算机是一个对象。现在停止指向计算机(放下手臂)。现在您是一个已分配null
的变量。计算机仍然存在,没有任何改变,唯一的区别是你现在不再指向它了。
答案 1 :(得分:0)
Address.Person
存储对象的引用。当您要求 Address.Person
时,它将按照引用路径返回原始对象。当您设置 Address.Person
时,您将使用新引用替换引用。在这种情况下,您将其设置为空或空引用。
答案 2 :(得分:0)
Address.Person只是对一个人的引用。将其设置为null将使Address类中的引用无效,但该人仍将存在。您创建的var(person)也只是一个引用,因此您不会将person变量置零。
答案 3 :(得分:0)
当您调用AddAddress
时,会在代码中显式设置Address.Person值public void AddAddress(Address address)
{
_addresses.Add(address);
address.Person = this;
}
当您从列表中删除值时,您的代码中没有删除引用的位置。实际上,如果你要调用Person.Addresses.Count,你会发现它认为其中有更多的地址而不是实际存在(因为你将值设置为null而不是调用Person.Addresses.Remove(0);