PascalABC.NET 4.0.1 Beta

Функция Copy для стандартных коллекций

В стандартную библиотеку добавлена функция Copy для коллекций List<T>, HashSet<T>, SortedSet<T> и Dictionary<T,T1>. Она создаёт новый экземпляр коллекции и переносит в него элементы исходной коллекции.

var L := Lst(1,3,4);

var L1 := Copy(L);
L1[1] := 777;
L1.Println;

var L2 := L;
L2[0] := 666;
L.Println

После вызова Copy(L) переменные L и L1 ссылаются на разные списки. Поэтому замена элемента в L1 не изменяет исходный список L: после выполнения L1[1] := 777 список L1 содержит 1 777 4, а L по-прежнему содержит 1 3 4.

Обычное присваивание var L2 := L работает иначе: новая коллекция не создаётся. Переменные L и L2 ссылаются на один и тот же список, поэтому изменение L2[0] := 666 видно и через L. В результате L содержит 666 3 4.

Copy выполняет поверхностное копирование. Сам контейнер становится независимым, однако если его элементы имеют ссылочный тип, в новую коллекцию копируются ссылки на те же объекты, а не копии этих объектов. Для Dictionary<T,T1> это правило применяется и к ключам, и к значениям.