Как называется этот тип копии и является ли это плохой практикой? - PullRequest
0 голосов
/ 11 октября 2010

Мелкая копия - это когда я пишу новую List<List<ClassA>>(lsA), которая просто копирует элемент ls.Таким образом, мелкие копии первого списка, а внутренний список - нет.Так как MyList имеет доступ к каждому вставляемому T (который в этом примере просто пропускается через C # List), он может сделать поверхностную копию каждого из них.Итак, теперь копируются все члены MyList и переменные, к которым он имеет прямой доступ.

Что это за копия?Он делает только поверхностную копию своих внутренних переменных, так что это не глубокая копия?поскольку его копирующие переменные могут касаться, а не только членские переменные, он больше не является мелкой копией.Этот тип копии называется?также это плохая практика, так как это не глубокая копия и, возможно, не более полезная, чем мелкая копия?

class ClassA { int a; }
class MyList<T> { List<T> ls; /*i cheat */ }
MyList<MyList<ClassA>> lsA;

1 Ответ

0 голосов
/ 11 октября 2010

Я действительно не уверен, что пытается сказать код внизу, однако, в любом случае, вот мой вариант (и вопрос не не зависит от языка):

Если данные (объекты) являются / являются неизменяемыми, то тип копии является в основном немым (на самом деле, нет причины для глубокого копирования с неизменяемыми объектами!). Уменьшая количество неизменяемости, я обычно не получаю глубокие копии (почти всегда), и «мелкая копия» с использованием стандартных конструкторов работает хорошо.

Обратите внимание, что, скажем, для List существует ctor List (IEnumerable collection) . Это, в свою очередь, просто создает новый объект, добавляя каждый элемент из существующего Enumerable по очереди, и правила следуют стандартному поведению типа «ref» / «struct» (помните, что типы struct могут быть упакованы неожиданным образом). Обратите внимание, что этот конструктор не является "копированием переменных": скорее он копирует значения объекта item переданного в Enumerable (это не подразумевает создание дублированного объекта для объектов "ref").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...