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