Вопросы о структурах

yum install rh-dotnet22-dotnet-runtime-2.2 

Это должно делать то, что вы хотите. Я попытаюсь поработать с Microsoft над обновлением документов, и я попрошу также обновить наши документы по RHEL 7.

7
задан Ben S 20 March 2009 в 18:18
поделиться

6 ответов

Существует пара различных ответов на этот вопрос, и это немного субъективно, но некоторые причины, о которых я могу думать:

  • Структуры являются типом значения, классы являются ссылочным типом. При использовании 16 байтов для общего устройства хранения данных это, вероятно, не стоит того для создания ссылок памяти (4 - 8 байтов) для каждого.
  • Когда у Вас есть действительно маленькие объекты, они могут часто продвигаться на стек IL вместо ссылок на объекты. Это может действительно ускорить некоторый код, поскольку Вы устраняете память, разыменовывают на стороне вызываемого.
  • Существует немного дополнительного "пуха", связанного с классами в IL, и если бы Ваша структура данных является очень небольшой, ни один из этого пуха не использовался бы так или иначе, таким образом, это - просто дополнительный спам, Вам не нужно.

Наиболее важное различие между структурой и классом, тем не менее, - то, что структуры являются типом значения, и классы являются ссылочным типом.

6
ответ дан 6 December 2019 в 23:13
поделиться

"Эффективным" они, вероятно, говорят об объеме памяти, который это берет для представления класса или структуры.

На 32-разрядной платформе, выделяя объект требует минимума 16 байтов. На 64-разрядной платформе минимальный размер объекта составляет 24 байта. Так, при рассмотрении его просто от используемого объема памяти структура, которая содержит меньше чем 16 байтов данных, будет "лучше", чем соответствующий класс.

Но используемый объем памяти не является целой историей. (Структуры) типов значения существенно отличаются, чем ссылочные типы (классы). Структуры могут быть неудобными для работы с и могут на самом деле вызвать проблемы производительности, если Вы не осторожны.

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

3
ответ дан 6 December 2019 в 23:13
поделиться

Проверьте эту ссылку, я нашел его на одном из ответов в ТАК сегодня: Внутренности Типа.NET. Можно также попытаться искать ТАК и погуглить для "ссылочных типов по сравнению с типами значения" для различий между структурами и классами.

Что ограничивает структуру в действии как класс?

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

У Вас не может быть виртуальных методов, таким образом, Вы не можете использовать структуру для реализации интерфейса. Методы экземпляра в структурах могут получить доступ к частным полям структуры, но кроме этого они ведут себя много как auxilirary функции "помощника" (для неизменных структур, они иногда не должны даже получать доступ к частным данным). Таким образом, я нахожу, что они не почти "ценны" как методы класса.

2
ответ дан 6 December 2019 в 23:13
поделиться

Это происходит из-за другого способа, которым CLR обрабатывает структуры и классы. Структуры являются типами значения, что означает, что они живут на стеке, а не в управляемой "куче". Это - хорошее эмпирическое правило для хранения структур маленькими, потому что, после того как Вы начинаете передавать их как аргументы метода, которым Вы подвергнетесь наверху, поскольку структуры копируются в их полноте при передаче методу.

Так как классы передают копию своей ссылки на методы, которым они подвергаются намного меньше служебный при использовании в качестве аргументов метода.

Лучший способ определить размер Вашего класса состоит в том, чтобы составить число байтов, требуемых всеми членами Вашего класса плюс дополнительные 8 байтов для CLR, наверху наполняют (синхронизирующий индекс блока и ссылка на тип объекта).

0
ответ дан 6 December 2019 в 23:13
поделиться

Структуры отличаются от классов, потому что они хранятся на стеке, а не на "куче". Это означает каждый раз вызов метода со структурой как параметр копия создается и передается методу. Именно поэтому большие структуры чрезвычайно неэффективны.

Я активно препятствовал бы для использования структур, тем не менее, потому что это могло вызвать некоторые тонкие ошибки: например, когда Вы изменяете поле структуры, не попытка быть отраженными для вызывающей стороны (потому что Вы только изменили копию) - который является совершенно другим поведением к классам.

Таким образом, 16 байтов, я думаю, являются разумным максимальным размером структуры, но все еще в большинстве случаев лучше иметь класс. Если Вы все еще хотите создать структуру, попытайтесь сделать ее неизменной, по крайней мере.

0
ответ дан 6 December 2019 в 23:13
поделиться

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

Об ограничениях: Вы не можете присвоить его пустому указателю (хотя можно использовать Nullable <>), и необходимо инициализировать его сразу же.

0
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

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