Когда я должен использовать структуру? - PullRequest
4 голосов
/ 03 марта 2011

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

Что такое "правило", когда использовать структуру и когда использовать класс?

Ответы [ 6 ]

2 голосов
/ 03 марта 2011

Правило номер один состоит в том, что он не должен быть больше 16 байтов. Обычно 4 поля. Код, генерируемый джиттером, принимает неприятные нотки, когда он становится больше. Это не совместимо с «кучей переменных». В простом классе нет ничего плохого.

1 голос
/ 03 марта 2011

С Действующий C #

Типы значений или ссылочные типы?Структуры или классы?Когда вы должны использовать каждый?Это не C ++, в котором вы определяете все типы как типы значений и можете создавать ссылки на них.Это не Java, в которой все является ссылочным типом (если вы не являетесь одним из разработчиков языка).Вы должны решить, как будут вести себя все экземпляры вашего типа при его создании.Это важное решение, чтобы получить право с первого раза.Вы должны согласиться с последствиями своего решения, потому что изменение позже может привести к тому, что немало кода сломается неуловимым образом.Это просто вопрос выбора ключевого слова struct или class при создании типа, но гораздо сложнее обновить все клиенты, использующие ваш тип, если вы измените его позже.

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

Из C # в глубину

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

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

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

Различия, которые мы наблюдали в реальном мире, составляют суть различий между типами значений и ссылочными типами в C # и .NET.Большинство типов в .NET являются ссылочными типами, и вы, вероятно, создадите гораздо больше ссылок, чем типов значений.Наиболее распространенные случаи, которые нужно знать, это то, что классы (объявленные с использованием класса) являются ссылочными типами, а структуры (объявленные с использованием struct) являются типами значений.Другие ситуации следующие:

Типы массивов являются ссылочными типами, даже если тип элемента является типом значения (поэтому int [] по-прежнему является ссылочным типом, даже если int является типом значения).

Перечисления (объявленные с использованием enum) являются типами значений.

Типы делегатов (объявленные с использованием делегата) являются ссылочными типами.

Типы интерфейса (объявленные с использованием интерфейса) являются ссылочными типами, но ониможет быть реализовано с помощью типов значений.

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

1 голос
/ 03 марта 2011

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

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

-структуры являются типами значений; классы являются ссылочными типами.

-В структуре должна быть хотя бы одна необщедоступная переменная или член события. класс может быть полностью пустым.

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

-класс используется в куче, а стек используется в стеке

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

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

спасибо Арефин

1 голос
/ 03 марта 2011

Мое эмпирическое правило заключается в том, что сущность представляет значение (и, следовательно, является неизменной) и не имеет идентичности (например, два экземпляра «5» одинаковы). Следовательно, вы должны переопределить ==, а также .Equals. String, например, это класс только по прагматическим соображениям. Аналогично, не используйте структуру для более чем нескольких полей. Вероятно, это могло быть далее разложено.

0 голосов
/ 03 марта 2011

Структуры обычно используются для небольших объемов данных, которые представляют собой единую связную единицу информации. Они обычно передаются по значению, которое включает передачу его копии, а не ссылку на сам объект.

Это означает, что у структур есть пара незначительных ошибок. Если

  • данные будут иметь семантику значений - то есть, если объект можно клонировать, не вызывая проблем, и важны значения, а не их идентичности;
  • общий объем данных будет меньше, чем около 16 байт, поскольку среда выполнения будет копировать их, а не просто передавать ссылку; и
  • если он неизменный, поскольку изменение копии обычно не приводит к изменению оригинала;

тогда вы можете преуспеть в использовании структуры.

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

0 голосов
/ 03 марта 2011

Смотрите ... эта статья MSDN

Структуры против классов

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

Куча или стек?

При вызове оператора New на класс, он будет размещен на куча. Тем не менее, когда вы создаете Структура, он создается в стеке. Это приведет к повышению производительности. Кроме того, вы не будете иметь дело с ссылки на экземпляр структуры как вы бы с классами. Ты будешь работать напрямую со структурой пример. Из-за этого, когда Передав структуру в метод, это передается по значению, а не как ссылка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...