Выбор между классом и структурой
Примечание.
Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.
Одно из основных решений по проектированию каждого конструктора платформ заключается в том, следует ли разрабатывать тип как класс (ссылочный тип) или как структуру (тип значения). Хорошее понимание различий в поведении ссылочных типов и типов значений имеет решающее значение при выборе.
Первое различие между ссылочными типами и типами значений, которое мы рассмотрим, заключается в том, что ссылочные типы выделяются в куче и сборе мусора, а типы значений выделяются либо на стеке, либо в встроенных типах, содержащихся в нем, и при удалении стека или при освобождении их содержащего типа. Поэтому распределение и распределение значений типов значений обычно дешевле, чем выделение и распределение ссылочных типов.
Далее массивы ссылочных типов выделяются вне линии, то есть элементы массива просто ссылаются на экземпляры ссылочного типа, размещенного в куче. Массивы типов значений выделяются встроенными, то есть элементы массива являются фактическими экземплярами типа значения. Поэтому распределение и распределение массивов типов значений гораздо дешевле, чем выделение и размещение массивов ссылочных типов. Кроме того, в большинстве случаев массивы типов значений демонстрируют гораздо лучшее расположение ссылок.
Следующее различие связано с использованием памяти. Типы значений получаются в поле при приведение к ссылочного типа или одному из интерфейсов, которые они реализуют. Они откружаются при возврате к типу значения. Так как поля — это объекты, выделенные в куче и собираемые мусором, слишком много бокса и распаковки могут негативно повлиять на кучу, сборщик мусора и, в конечном счете, производительность приложения. В отличие от этого, такой бокс не возникает, так как ссылочные типы являются приведение. (Дополнительные сведения см. в разделе Бокс и распаковка).
Затем назначения ссылочных типов копируют ссылку, а назначения типов значений копируют все значение. Поэтому назначения больших ссылочных типов дешевле, чем назначения больших типов значений.
Наконец, ссылочные типы передаются по ссылке, а типы значений передаются по значению. Изменения экземпляра ссылочного типа влияют на все ссылки, указывающие на экземпляр. Экземпляры типов значений копируются при передаче по значению. При изменении экземпляра типа значения он, конечно, не влияет ни на одну из его копий. Так как копии не создаются явным образом пользователем, но неявно создаются при возврате аргументов или возвращаемых значений, типы значений, которые можно изменить, могут быть запутаны для многих пользователей. Поэтому типы значений должны быть неизменяемыми.
Как правило, большинство типов в платформе должны быть классами. Однако существуют некоторые ситуации, в которых характеристики типа значения делают его более подходящим для использования структур.
✔️ Рекомендуется определить структуру вместо класса, если экземпляры типа являются небольшими и обычно кратковременными или обычно внедрены в другие объекты.
❌ Избегайте определения структуры, если тип не имеет всех следующих характеристик:
Он логически представляет одно значение, аналогичное примитивным типам (
int
,double
и т. д.).Он имеет размер экземпляра менее 16 байтов.
Это неизменяемо.
Его не придется часто упаковать.
Во всех остальных случаях следует определить типы как классы.
Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.
Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.