2013-01-24 12 views
6

Pracuję nad małą aplikacją na .NET, muszę wskazać te same dane z 2 różnymi listami, zastanawiam się, czy może pamięć jest powielana, na przykładPowielona pamięć na .NET przy użyciu dwóch list

public class Person 
{ 
    public string name; 
    public int age; 

    .... 
    public Person(name, age) 
    { 
     this.name = name; 
     this.age = age; 
    } 
} 

SortedList<string> names; 
SortedList<int> ages; 

Person person1 = new Person("juan",23); 

names.add("juan",person1); 
ages.add(23,person1); 

myślę, że jak .NET Java nie będzie powielać Osoba obiektu, więc to będzie keeped, więc jeśli mogę to zrobić:

names("juan").age = 24 

Will zmienić obiekt na obu listach.

Czy to prawda?

Dziękuję.

Odpowiedz

5

Ponieważ Person jest klasa, narażasz tylko odniesienie na listę, więc każda lista będzie miała odniesienie do tej samej osoby. Obiekt Person rzeczywiście nie zostanie zduplikowany, a names["juan"] odrzuci oryginalny obiekt.

Jednak! To nie czyni kodu bezbłędnego:

  • może być więcej niż jedna osoba w wieku 23 lat; nie podoba się, że
  • zmiana wieku poprzez names["juan"] nie zostanie automatycznie zaktualizowana ages; ages[24] zawiedzie

Jeśli Person był struct, wówczas Personbyłoby być kopiowane przy każdym przypisać go (ale: to nie jest dobrym kandydatem na struct, nie rób tego)

1

Tak, spowoduje to zmianę obiektu na obu listach.

jeśli chcesz Provident to proponuję przeciążać „=” operator (Explicit)

+1

Jak nadpisanie pomocy operatora? nigdzie go nie ma. –

+0

Dziękuję, pracuję tylko z dużymi rozmiarami listów i bałem się, że zduplikują dane. Używam tylko tej klasy, na przykład mój obiekt jest bardziej złożony. – Balder

+0

, aby utworzyć konstruktora kopiowania! –

1

aby przetestować równości odniesienia, zawsze można zrobić:

bool equals = ReferenceEquals(obj1, obj2); 
//in your case, obj1 = names["juan"], and obj2 = ages[23] 

Jeśli referencyjna jest taka sama, co oznacza, że ​​każda zmiana na nim zostaną odzwierciedlone na zmiennych odniesienie do ten sam obiekt.


W twoim przypadku, tak, oni są tak samo odniesienie w obu listach .. Więc jeśli nic robić na odniesienie, czy to na person1, names["juan"] lub ages[23] będzie widoczne wszędzie. To powiedziawszy, twoja kolekcja powinna wyglądać następująco:

Person person1 = new Person(); 
SortedList<string, Person> names = new SortedList<string, Person>(); 
SortedList<int, Person> ages = new SortedList<int, Person>(); 

names.Add("juan", person1); 
ages.Add(23, person1); 

//names["juan"].age 
//ages[23].age 
//etc 
Powiązane problemy