2013-01-24 13 views
6

Ich arbeite an einer kleinen App auf .NET, ich muss die gleichen Daten mit 2 verschiedenen Listen, ich frage mich, ob vielleicht der Speicher dupliziert ist, zum BeispielDuplicated Memory auf .NET mit zwei Listen

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

ich denke, dass .NET als Java wird das Objekt Person nicht duplizieren, so dass es keeped wird, also wenn ich dies tun:

names("juan").age = 24 

wird das Objekt in beiden Listen ändern.

Ist es richtig?

Vielen Dank.

Antwort

5

Da Person eine Klasse ist, sind Sie nur eine Referenz in die Liste setzen, so dass jede Liste eine hat Referenz an die gleiche Person. Das Person Objekt wird tatsächlich nicht dupliziert, und names["juan"] wird das ursprüngliche Objekt de-referenzieren.

Jedoch! Das macht den Code nicht fehlerfrei:

  • Es könnte mehr als eine Person im Alter von 23 sein; SortedList<,> wird nicht so gefallen
  • Änderung des Alters über names["juan"] wird nicht automatisch aktualisiert ages; ages[24] fehl

Wenn Person ein struct war, dann ist die Personwürde jedes Mal kopiert Sie es zuweisen (aber: dies ist kein guter Kandidat für eine struct, tun das nicht)

1

Ja, Dies ändert das Objekt in beiden Listen.

wenn Sie provident wollen dies schlage ich vor, den Operator „=“ zu überlasten (expliziten)

+1

Wie würde Override der Operator helfen? Es gibt nirgendwo wo das verwendet wird –

+0

Danke, ich arbeite gerade mit Listen von großer Größe, und ich hatte Angst, sie werden Daten duplizieren. Ich benutze nur diese Klasse zum Beispiel, mein reales Objekt ist komplexer. – Balder

+0

um einen Kopierkonstruktor zu erstellen! –

1

Referenz Gleichheit zu testen, können Sie immer tun:

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

Wenn Referenz ist die gleiche, dass jede Änderung auf es bedeutet, auf Variablen berücksichtigt werden, die auf die Referenz gleiches Objekt.


In Ihrem Fall, ja, sie sind nur der gleiche Bezug in beiden Listen .. Also, wenn Sie etwas auf dem Referenz tun, seien es auf person1, names["juan"] oder ages[23] wird es überall widerspiegelt. Das heißt, Ihre Sammlung sollte wie folgt aussehen:

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