Pytanie pewnie o podstawy podstaw, jednak wolę się upewnić co do poprawności mojego myślenia.
Pracuję (spokojnie, tylko hobbystycznie) z listami obiektów, które same w sobie mogą (ale nie muszą) zawierać kolejne listy obiektów składowych.
Przykładowo mam listę obiektów klasy [zestaw], z których każdy zawiera jeszcze listę obiektów [kredki].
Mam przygotowane dane wejściowe, jednak chcę część danych odfiltrować aby wyświetlić tylko cześć danych, tworzę więc kopię lokalną.
Jak już wiem polecenie List<T> new_list = old_list prowadzi do kłopotów*, bo dane są przekazywane przez referencję.
Pytanie: jak skopiować poprawnie nową listę tak, aby była niezależną kopią listy wejściowej?
Normalnie użyłbym prostej pętli:
private List<T> Copy_List(List<T> old_list)
{
new_list = new List<T>();
foreach (var i in old_list)
{ new_list.Add(i); }
return new_list;
}
ALE...
ale zaniepokoiło mnie to, co wyczytałem w głębi internetu:
Gdy wywołujemy clone dla klasy zawierającej obiekty innych klas (agregaty), należy pamiętać by w metodzie __clone() wywołać polecenie clone dla obiektów zawieranych, w innym wypadku kopia będzie posiadać referencję do obiektów zawieranych w oryginale.
Co prawda nie używam Clone, ale mam wątpliwości: czy zaproponowna pętla foreach jest poprawnym rozwiązaniem dla agregatów?
- z drugiej strony dziwne, że
int a = 10;
int b = a;
b = 0;
to a = 10, w końcu int to też obiekt.