“Наверху” класса по сравнению со структурой в C#?

Я делаю курс 3354 (Реализация Системных Типов и Интерфейсов в Платформе.NET 2.0), и сказано, что для простых классов, с членскими переменными и функциями, лучше использовать структуру, чем класс из-за издержек.

Я никогда не слышал о такой вещи, какова законность этого требования?

14
задан Enriquev 28 March 2012 в 22:33
поделиться

11 ответов

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

Хотя структуры C # допускают использование членов, они работают несколько иначе, чем классы (не могут быть разделены на подтипы, нет виртуальной диспетчеризации, могут полностью жить в стеке), а поведение меняется в зависимости от подъема, и т.д. (подъем - это процесс продвижения типа значения в кучу - сюрприз!)

Итак, отвечу на вопрос: я думаю, что одним из самых больших неправильных терминов в C # является использование структур «для повышения производительности». Причина этого в том, что «накладные расходы» не могут быть по-настоящему измерены, не зная, как они взаимодействуют с остальной системой и какую роль, если что-то примечательное, она играет. Это требует профилирования и не может быть суммировано таким тривиальным утверждением, как «меньше накладных расходов».

Есть несколько хороших случаев для типов структурных значений - одним из примеров является составное значение RGB, хранящееся в массиве для изображения. Это связано с тем, что тип RGB небольшой, может быть очень много в изображении, типы значений могут быть хорошо упакованы в массивы, и могут помочь сохранить лучшую локальность памяти и т. Д.

{{1 }}
12
ответ дан 1 December 2019 в 08:42
поделиться

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

В MSDN есть страница , на которой можно выбрать классы и структуры .

Резюме:

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

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

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

9
ответ дан 1 December 2019 в 08:42
поделиться

Когда C # находился в стадии бета-тестирования, мне была продемонстрирована разница между классом и структурой. Разработчики создали программу просмотра множеств Мандельброта, которая обрабатывает множество комплексных чисел для достижения результата. В первом случае они запускали код с комплексными числами, представленными как класс с полями Real и Imaginary. Затем они изменили слово class на struct и перекомпилировали. Разница в производительности была огромной.

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

8
ответ дан 1 December 2019 в 08:42
поделиться

Вы собираетесь использовать класс примерно 95% времени. Семантика типа значения в конечном итоге чаще всего кусает вас в задницу в будущем.

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

2
ответ дан 1 December 2019 в 08:42
поделиться

Для простых типов, у которых их много, не требующих наследования и которые являются хорошим кандидатом на неизменность, хорошо подходят структуры. Примеры: Point, Rectangle, Decimal и DateTime.

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

0
ответ дан 1 December 2019 в 08:42
поделиться

Я считаю, что наиболее часто цитируемая точка безубыточности составляет около 12 байтов данных в вашей структуре. Так, например, 3 целых числа. Однако разница между типом значения и ссылочным типом гораздо более фундаментальная, и вы должны делать свой выбор на основе этого для типов с небольшим количеством членов.

Если что-то большое, то класс :)

0
ответ дан 1 December 2019 в 08:42
поделиться

Структуры - это типы значений, а классы - ссылочные типы. Итак, если вы собираетесь передавать ссылки, классы могут быть лучше с точки зрения производительности, поскольку вы копируете адрес, а не всю структуру. Однако, если вы собираетесь создавать экземпляры и ссылаться на эти объекты большое количество раз, структуры будут намного эффективнее, поскольку они размещены в стеке. Таким образом, структуры могут быть лучше для множества объектов, где важна производительность, или для небольших объектов, где желательна семантика типа значения. У структур также нет конструктора по умолчанию. Они наследуются от Object, но в остальном они не наследуются.

0
ответ дан 1 December 2019 в 08:42
поделиться

В C# классы и структуры - это совершенно разные звери. Синтаксис у них почти одинаковый, но поведение совершенно разное (ссылка против значения). Отдельный экземпляр struct будет использовать меньше памяти, чем эквивалентный класс, но как только вы начнете создавать коллекции или передавать их, семантика типа значения убьет вас с точки зрения производительности (и, возможно, потребления памяти в зависимости от того, что вы делаете), если только данные в struct не очень малы. Я не знаю, какова жесткая цифра, но мы говорим о порядке 8 байт или меньше.

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

1
ответ дан 1 December 2019 в 08:42
поделиться

struct - это тип значения, а class - ссылочный тип. это может быть одной из причин.

0
ответ дан 1 December 2019 в 08:42
поделиться

Нет необходимости выделять / освобождать структуры.

-1
ответ дан 1 December 2019 в 08:42
поделиться

Одно практическое правило, которому вы можете следовать, - спросите себя , действительно ли или нет то, что вы пытаетесь сделать, похоже на System.Date Если это не так, тогда вам действительно стоит усомниться в своем решении использовать структуры.

1
ответ дан 1 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

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