Когда использовать структуру?

Вы создали класс abstract :

  public abstract class PasswordProtectedEditTextPreference  

Неудивительно, что он не может быть создан, -)

1318
задан Mark Hurd 11 January 2017 в 12:37
поделиться

11 ответов

Структуры хороши для атомарного представления данных, где упомянутые данные могут быть скопированы многократно кодом. Клонирование объекта является в целом более дорогим, чем копирование структуры, поскольку это включает выделение памяти, выполняя конструктора и освобождение/сборку "мусора" при выполнении с ним.

34
ответ дан Franci Penov 11 January 2017 в 22:37
поделиться

Используйте структуру, когда Вы захотите семантику значения в противоположность ссылочной семантике.

Редактирование

Не уверенный, почему люди являются downvoting это, но это - актуальный вопрос и было сделано, прежде чем op разъяснил его вопрос, и это - самая фундаментальная основная причина структуры.

при необходимости в ссылочной семантике, Вам нужен класс не структура.

84
ответ дан nawfal 11 January 2017 в 22:37
поделиться

Каждый раз, когда Вы не нуждаетесь в полиморфизме, хотите семантику значения и хотите избежать выделения "кучи" и связанной сборки "мусора" наверху. Протест, однако, состоит в том, что структуры (произвольно большой) являются более дорогими для раздавания, чем ссылки класса (обычно одно машинное слово), таким образом, классы могли закончить тем, что были быстрее на практике.

153
ответ дан dsimcha 11 January 2017 в 22:37
поделиться

Я использую структуры для упаковки или распаковки любого вида двоичного коммуникационного формата. Это включает чтение или запись в диск, списки вершины DirectX, сетевые протоколы, или контакт с шифровал/сжимал данные.

Эти три инструкции, которые Вы перечисляете, не были полезны для меня в этом контексте. Когда я должен выписать четыреста байтов материала в Особом Порядке, я собираюсь определять четырехсотбайтовую структуру, и я собираюсь заполнять его любыми несвязанными значениями, которые он, как предполагается, имеет, и я собираюсь установить его независимо от того, что путь имеет большую часть смысла в то время. (Хорошо, четыреста байтов были бы довольно странными - но назад когда я писал файлы Excel для жизни, я имел дело со структурами приблизительно до сорока байтов на всем протяжении, потому что это - насколько большой некоторые записи СИЛЬНОГО УДАРА.)

16
ответ дан mjfgates 11 January 2017 в 22:37
поделиться

Необходимо использовать "структуру" в ситуациях, где Вы хотите явно указать расположение памяти с помощью StructLayoutAttribute - обычно для PInvoke.

Редактирование: Комментарий указывает, что можно использовать класс или структуру с StructLayoutAttribute, и это, конечно, верно. На практике Вы обычно использовали бы структуру - она выделяется на стеке по сравнению с "кучей", которая имеет смысл, если Вы просто передаете аргумент неуправляемому вызову метода.

17
ответ дан Maurice Flanagan 11 January 2017 в 22:37
поделиться

Во-первых: сценарии Interop или когда необходимо указать расположение памяти

111-секундный: Когда данные являются почти тем же размером как ссылочный указатель так или иначе.

19
ответ дан BC. 11 January 2017 в 22:37
поделиться
  • 1
    также, набор () является хорошей заменой для Отличного () – Phil 30 June 2011 в 08:57

Я думаю, что хорошее первое приближение никогда не.

я думаю, что хорошее второе приближение никогда не.

, Если Вы отчаянно нуждаетесь в перфекте, рассмотрите их, но затем всегда имейте размеры.

5
ответ дан Brian 11 January 2017 в 22:37
поделиться

Я редко использую структуру для вещей. Но это - просто я. Это зависит, нужен ли мне объект быть nullable или нет.

, Как указано в других ответах, я использую классы для реальных объектов. У меня также есть мышление структур, используются для хранения небольших объемов данных.

2
ответ дан Flexo 11 January 2017 в 22:37
поделиться

За исключением valuetypes, которые используются непосредственно и различными другими во время выполнения в целях PInvoke, необходимо только использовать valuetypes в 2 сценариях.

  1. , Когда Вы должны скопировать семантику.
  2. , Когда Вам нужна автоматическая инициализация, обычно в массивах этих типов.
15
ответ дан leppie 11 January 2017 в 22:37
поделиться

Nah - я не полностью соглашаюсь с правилами. Они - хорошие инструкции для рассмотрения с производительностью и стандартизацией, но не в свете возможностей.

, Как Вы видите в ответах, существует много творческих способов использовать их. Так, эти инструкции должны просто быть то, что, всегда ради производительности и эффективности.

В этом случае, я использую классы для представления объектов реального мира в их большей форме, я использую структуры для представления меньших объектов, которые имеют более точное использование. Путем Вы сказали это, "более связное целое". Причем ключевое слово связно. Классы будут более объектно-ориентированными элементами, в то время как структуры могут иметь некоторые из тех характеристик, хотя в меньшем масштабе. IMO.

я использую их много в тегах Treeview и Listview, где к общим статическим атрибутам можно получить доступ очень быстро. Я всегда изо всех сил пытался получить эту информацию иначе. Например, в моих приложениях базы данных, я использую Treeview, где у меня есть Таблицы, SPS, Функции или любые другие объекты. Я создаю и заполняю свою структуру, помещаю ее в тег, вытаскиваю ее, получаю данные выбора и т.д. Я не сделал бы этого с классом!

я действительно пытаюсь сохранить их маленькими, использовать их в единственных ситуациях с экземпляром и помешать им изменяться. Благоразумно знать о памяти, выделении и производительности. И тестирование так необходимо.

10
ответ дан SnapJag 11 January 2017 в 22:37
поделиться

Я не соглашаюсь с правилами, данными в исходном сообщении. Вот мои правила:

1) Вы используете структуры для производительности при хранении в массивах. (см. также , Когда структуры будут ответом? )

2) Вам нужны они в коде, передающем структурированные данные C/C++

, 3) не используют структуры, если Вам не нужны они:

  • Они ведут себя отличающиеся от "обычных объектов" ( ссылочные типы ) под присвоением и при передаче как аргументы, которые могут привести к неожиданному поведению; это особенно опасно, если человек, смотрящий на код, не знает, что они имеют дело со структурой.
  • Они не могут быть наследованы.
  • Передающие структуры как аргументы является более дорогим, чем классы.
142
ответ дан Community 11 January 2017 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: