Confuso sobre referências em objetos

votos
1

Estou realmente confuso sobre relações de objetos! Eu tenho duas classes Pessoa e endereço. Aqui estão os detalhes:

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

O método AddAddress na classe Pessoa acrescenta o endereço para a coleta endereços e também define a pessoa para o objeto Address. Agora, no código que eu faça o seguinte:

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

            person.Addresses[0].Person = null; 

Estou a pensar que ele deve definir o objeto pessoa como nulo desde Endereços [0] .Person está apontando para o objeto original pessoa. Mas não é defini-lo como nulo. O que está acontecendo aqui?

Publicado 26/08/2009 em 23:25
fonte usuário
Em outras línguas...                            


4 respostas

votos
8

O que está acontecendo aqui?

Explicação simples:

Uma variável, neste caso, 'Pessoa', detém uma referencepara o objeto. Sob o capô, este é apenas um número. Quando você atribuí-lo como nulo, o que você está fazendo é apenas parar que variável apontando para o objeto. O próprio objeto ainda existe.

- Editar

Uma maneira de entender como isso funciona, é ficar literalmente perto do seu computador, e apontar para ele. Você agora é uma variável, e seu computador é um objeto. Agora, pare de apontando para o computador (colocar o seu braço para baixo). Agora você é uma variável que tem sido atribuído null. O computador ainda existe, nada mudou sobre isso, a única diferença é que agora não mais ponto para ele.

Respondeu 26/08/2009 em 23:28
fonte usuário

votos
0

O valor Address.Person é explicitamente definido em seu código quando você chamar AddAddress

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

Nenhum onde em seu código que você remover a referência quando você remove o valor da lista. De fato, se você fosse para chamar Person.Addresses.Count, você veria que ele acha que existem mais endereços nele do que realmente são (porque você definir o valor como nulo em vez de chamar Person.Addresses.Remove (0);

Respondeu 26/08/2009 em 23:34
fonte usuário

votos
0

Address.Person é apenas uma referência a uma pessoa. Defini-la como nula, anula a referência na classe Address, mas a pessoa continuará a existir. O var você cria (pessoa) também é apenas uma referência, então você não está anulando a variável pessoa. No momento em que você faz nulo o de referência pessoa (pessoa = null;), a pessoa vai ficar lixo coletado.

Respondeu 26/08/2009 em 23:32
fonte usuário

votos
0

Address.Personarmazena uma referência a um objecto. Quando você pedir Address.Person , ele vai seguir o caminho de referência de volta ao objeto original. Quando você definir Address.Person , você está substituindo a referência com uma nova referência. Neste caso, você está definindo-o para nada, ou uma referência vazia.

Respondeu 26/08/2009 em 23:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more