Zmatená o odkazy v objektech

hlasů
1

Jsem opravdu zmatená o objektových vztahů! Mám dvě třídy osoba a adresa. Zde jsou podrobnosti:

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

Způsob AddAddress ve třídě Person přidá adresu do kolekce adresy a také nastaví osobu za objekt adres. Nyní, v kódu I proveďte následující kroky:

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

            person.Addresses[0].Person = null; 

Mám na mysli, že by měla nastavit objekt osoba na hodnotu null, protože adresy [0] .Person ukazuje původní osobě objektu. Ale to není nastavení je na hodnotu null. Co se to tu děje?

Položena 26/08/2009 v 23:25
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
8

Co se to tu děje?

Jednoduché vysvětlení:

Proměnná, v tomto případě ‚osoba‘, drží referencena objekt. Pod kapotou je to jen číslo. Když přiřadíte ji na null, co děláte, je právě zastavením této proměnné ukazující na objekt. Samotný objekt stále existuje.

-- Upravit

Způsob, jak pochopit, jak to funguje, je doslova postavit poblíž svého počítače, a bod na ní. Nyní jste variabilní, a počítač je objekt. Nyní zastavit a ukázal na počítači (dát ruku dolů). Nyní jste proměnná, která byla přiřazena null. Počítač stále existuje, nic se nezměnilo o tom, jediný rozdíl je, že vás teď ne-déle bod na něj.

Odpovězeno 26/08/2009 v 23:28
zdroj uživatelem

hlasů
0

Hodnota Address.Person je výslovně nastavena v kódu, když zavoláte AddAddress

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

No, kde v kódu se vám odstranit referenci při odebrání hodnotu ze seznamu. Ve skutečnosti, pokud jste byli volat Person.Addresses.Count, měli byste vidět, že si myslí, že existuje více adres v ní, než tam ve skutečnosti jsou (protože jste nastavit hodnotu na null namísto volání Person.Addresses.Remove (0);

Odpovězeno 26/08/2009 v 23:34
zdroj uživatelem

hlasů
0

Address.Person je jen odkaz na osobu. Nastavením na null bude anulovat odkaz ve třídě adres, ale bude i nadále existovat. Var vytvořit (osoba) je také jen reference, takže nejste nulling ven osoba proměnné. Ve chvíli, kdy budete dělat null ven odkaz na osobu (osoby = null), osoba dostane smetí shromáždilo.

Odpovězeno 26/08/2009 v 23:32
zdroj uživatelem

hlasů
0

Address.Personukládá odkaz na objekt. Když budete žádat Address.Person , bude sledovat referenční cestu zpět k původnímu objektu. Když se nastaví Address.Person , měníte odkaz s novým odkazem. V tomto případě se nastavení na nic, nebo prázdný odkaz.

Odpovězeno 26/08/2009 v 23:28
zdroj uživatelem

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