2013-01-24 14 views
6

Sto lavorando su una piccola app su .NET, ho bisogno di puntare gli stessi dati con 2 liste diverse, mi chiedo se forse la memoria è duplicata, ad esempioMemoria duplicata su .NET utilizzando due elenchi

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

immagino che .NET come Java non duplicherà la persona oggetto, quindi sarà keeped, quindi se faccio questo:

names("juan").age = 24 

cambierà l'oggetto in entrambe le liste.

È giusto?

Grazie.

risposta

5

Perché Person è una classe, si sta solo mettendo un di riferimento nella lista, in modo da ciascuna lista avrà un riferimento alla stessa persona. L'oggetto Person non verrà effettivamente duplicato e names["juan"] rimuoverà l'oggetto originale.

Tuttavia! Ciò non rende il codice ineccepibile:

  • ci può essere più di una persona di 23 anni; SortedList<,> non piacerà che
  • cambiare l'età via names["juan"] non aggiornerà automaticamente ages; ages[24] mancherà

Se Person era un struct, allora la Personsarebbe essere copiati ogni volta che si assegna (ma: questo non è un buon candidato per un struct, non fare così)

1

Sì, questo cambierà l'oggetto in entrambi gli elenchi.

se si vuole provvidente questo consiglio di sovraccaricare il "=" operatore (esplicito)

+1

In che modo l'operatore può ignorare? non c'è da nessuna parte dove viene utilizzato –

+0

Grazie, sto solo lavorando con elenchi di grandi dimensioni, e avevo paura di duplicare i dati. Ad esempio, uso solo quella classe, il mio vero oggetto è più complesso. – Balder

+0

per creare un costruttore di copie! –

1

per testare l'uguaglianza di riferimento, si può sempre fare:

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

Se di riferimento è la stessa che, qualsiasi modifica su di esso si rifletterà sulle variabili che fanno riferimento al stesso oggetto.


Nel tuo caso, sì, sono proprio la stessa di riferimento in entrambe le liste .. Quindi se fare qualcosa sul riferimento, sia esso su person1, names["juan"] o ages[23] si rifletterà in tutto il mondo. Detto questo, la tua raccolta dovrebbe essere simile a:

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