2009-08-26 3 views
1

Я действительно смущен объектными отношениями! У меня есть два класса Person and Address. Вот подробности:Confused об ссылках на объекты

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; 
     } 
    } 

Метод AddAddress в классе Person добавляет адрес для сбора адресов, а также устанавливает Person для объекта Address. Теперь, в коде я делаю следующее:

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

      person.Addresses[0].Person = null; 

Я имею в виду, что он должен установить объект человека в нуль, так как адреса [0] .Person указывает на исходный объект человека. Но он не устанавливает его значение null. Что здесь происходит?

+0

Cue Jon Skeet. :) – johnc

+0

@tony спасибо за вопрос! Если ответ решает вашу проблему, попробуйте нажать «галочку» рядом с этим ответом, чтобы вознаградить человека, который его предоставил. –

ответ

8

Что здесь происходит?

Простое объяснение:

переменной, в данном случае 'лицо', имеет reference к объекту. Под капотом это всего лишь номер. Когда вы назначаете его нулевому, то, что вы делаете, просто останавливает эту переменную, указывающую на объект. Сам объект все еще существует.

- Edit

Путь понять, как это работает, это в буквальном смысле стоять рядом с компьютером, и указать на него. Теперь вы являетесь переменной, и ваш компьютер является объектом. Теперь прекратите указывать на компьютер (положите руку вниз). Теперь вы являетесь переменной, которая была назначена null. Компьютер все еще существует, ничего не изменилось, единственное отличие в том, что теперь вы больше не указываете на него.

+0

О, да! Я задаюсь этим вопросом, как мозг гороха. Конечно, он указывал на объект Person, и теперь он указывает на null. Если я установил объект основного лица равным null, то все зависимости в объекте Address также будут установлены в null, так как они указывают на исходный объект. Спасибо, я сожалею, что был таким глупым! – 2009-08-26 22:30:00

+0

Не волнуйтесь, мы все задали вопрос с очевидным ответом на листе один раз :-) –

+0

+1 Мне нравится пример :) – Kelsey

0

Address.Person хранит ссылку на объект. Когда вы спросите уAddress.Person, он будет следовать по пути ссылки к исходному объекту. Когда вы установили Address.Person, вы заменяете ссылку новой ссылкой. В этом случае вы ничего не устанавливаете или пустую ссылку.

0

Адрес.Персон - это просто ссылка на человека. Установка его в null приведет к аннулированию ссылки в классе Address, но человек все равно будет существовать. Созданный вами var (person) также является просто ссылкой, поэтому вы не обнуляете переменную person. В тот момент, когда вы отклоняете ссылку на человека (person = null;), человек получает сбор мусора.

0

Значение Address.Person явно устанавливается в коде, когда вы звоните AddAddress

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

Нет, где в коде вы удалить ссылку, когда вы удалите значение из списка. Фактически, если вы должны были вызвать Person.Addresses.Count, вы увидите, что он считает, что в нем больше адресов, чем на самом деле (потому что вы задали значение null вместо вызова Person.Addresses.Remove (0);

Смежные вопросы