C #, struct vs class, быстрее?

Возможный дубликат:
Что лучше для хранилища данных Struct / Classes?

Рассмотрим пример, где у меня есть объект Employee с такими атрибутами, как возраст, имя, пол, заголовок, зарплата. Теперь у меня есть список, который я хочу заполнить кучей сотрудников (каждый экземпляр Employee уникален).

С точки зрения скорости и памяти, предпочтительнее ли создавать сотрудника как Struct или Class?

Любые дополнительные оговорки в отношении Struct vs Class в приведенном выше сценарии приветствуются

Структуры должны использоваться только для относительно небольших структур, которые должны иметь поведение, подобное ценности.

  • Различия в classе и структуре
  • Выбор между classами и структурами

Не определяйте структуру, если тип не имеет всех следующих характеристик :

  • Он логически представляет одно значение, подобное примитивным типам (целое, двойное и т. Д.).
  • Он имеет размер экземпляра меньше 16 байт.
  • Это неизменно.
  • Его не нужно часто вставлять в бокс.

Ваш тип ломает первые два руководства и, вероятно, также третий. Поэтому вы обязательно должны использовать class здесь.

Это не так просто – вам нужно описать поведение . Например, struct будет копировать себя, как только захочет, поэтому в некотором смысле они могут потреблять больше памяти. Однако массив структур в виде необработанного дампа данных может избежать (очень малого) заголовка объекта (и дополнительного разыменования), поэтому он может иметь эффективность.

Однако большая проблема заключается в том, как вы их концептуализируете; Работник не является ценностью ; если я назначу:

 var emp = GetEmployee(); var tmp = emp; 

означает ли это, что теперь у меня должно быть 2 сотрудника? Это, пожалуй, нет. Теперь, если я изменюсь:

 tmp.Name = "Fred"; 

влияет ли это на emp зависит ли он от структуры или classа. Я утверждаю, что здесь должен быть class. Я также предлагаю, чтобы структура была почти всегда неизменной, чтобы избежать такого типа сценария потери данных. Существует случай для изменчивых структур, но он часто используется неправильно, что я не хочу случайно побуждать вас делать это.

Другие проблемы возникают при инкапсуляции с помощью структур; учтите, что у сотрудника есть менеджер; Это возможно?

 [struct|class] Manager { private Manager boss; } 

это работает только для classа. Снова; структуры не очень подходят для такого типа использования. Не polymorphism, абстракция и т. Д.

Это зависит, возможно, class будет в этом случае. Надежда ниже пунктов поможет вам решить.

Желательно использовать структуру в следующем состоянии.

Когда у вас небольшая структура данных

Структура данных не требует расширения функциональности.

Если вы хотите выполнить более быструю работу над структурой данных. (Поскольку структура хранится в стеке, выполняемая операция выполняется быстрее).

Желательно использовать class в следующем состоянии.

Когда у вас сложная структура данных

Структура данных требует расширения функциональности.

Когда вы хотите оптимизировать использование памяти. (Поскольку class хранится в куче, они собираются собирать мусор, когда нет ссылки, указывающей на объект.)

Посмотрите здесь, чтобы узнать подробности.