Существует несколько проблем с аргументацией, представленной для шаблона, который вы описываете.
Во-первых, Структуры не всегда, выделенные на стек. Они выделяются только в стеке, когда параметры или локальные экземпляры внутри метода. Структурой, которая определена как член класса, на самом деле выделена куча. Таким образом, аргумент о том, что структура более эффективен из-за сокращения усилий для сбора мусора, справедлив только в определенных узких контекстах.
Во-вторых, любые члены класса, не относящиеся к ValueType, также выделяются на кучу (например, строки). Таким образом, даже если структура может быть просто удалена из стека, любые объекты кучи, которые она ссылается, все равно должны быть собраны в мусор.
В-третьих, Структуры редко сохраняют память, поскольку, когда они передаются как аргументы метода, у них есть значение-семантика. Это в основном означает, что копия структуры создается и передается, а не ссылка на существующую структуру - это не может быть менее дорогостоящим в памяти. Когда вы видите другие ответы, которые говорят, что изменчивые структуры могут быть проблемой - по этой причине (наряду с несколькими другими), поскольку, поскольку структуры передаются по значению, изменения в исходной структуре недоступны для местоположений, которые сделали копию структура. Это может привести к нарушению допущений или ожиданий в рамках программы, где у вас может быть действительно желательная ссылочная семантика для структуры.
Лично я нахожу шаблон создания объектов DTO (будь то классы или структуры) для размещения внутри объектов бизнес-уровня, которые, как представляется, не имеют большой пользы. Если у вас нет уровня персистентности или представления, который
специально использует этот шаблон для передачи информации через уровни, я не вижу большого значения.
Кроме того, конкретный случай использования структуры как объекта DTO кажется ошибочным, поскольку он вводит излишнюю избыточность. Поскольку structs не может наследовать другие структуры, вы не можете выразить is-a отношения. Что вы делаете, когда у вас есть Клиент, который наследует от Лица. Повторяете ли вы все свойства Person в структуре Customer? Вы встраиваете структуру Person внутри структуры Customer? Ни один подход не идеален. Если вы, по крайней мере, использовали классы, вы могли бы продлить действие Клиентом.
Это ваш инструктор: прекратите переполнение стека в классе и обратите внимание! –
Мы были на ланч, честно! –
Почему бы просто не использовать Structs? Вы можете иметь методы в Struct точно так же, как класс. – RBarryYoung