C # Struct советы по использованию? - PullRequest
7 голосов
/ 13 марта 2009

Мне очень нравится использовать структуры.

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

Смотрите также:

Ответы [ 7 ]

11 голосов
/ 13 марта 2009

Вы должны сделать следующие соображения о структурах:

  • структуры должны быть неизменными (изменяемые структуры не являются интуитивными и непредсказуемыми)
  • structs всегда имеет конструктор по умолчанию (открытый без параметров), который нельзя изменить
  • Размер структуры не должен превышать 16 байт
  • методы Equals и GetHashCode должны быть переопределены для лучшей производительности
  • рекомендуется реализация IEquatable<T> интерфейса
  • переопределение и == и операторы != также рекомендуется
11 голосов
/ 13 марта 2009

Я почти никогда определяю пользовательские структуры. ИМО не так уж много типов природных ценностей.

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

Я думаю, что стоит прочитать "Выбор между классами и структурами" из "Рекомендации по разработке библиотек классов" .

В частности:

Не определять структуру, если Тип имеет все следующие Характеристики:

  • Логически представляет собой один значение, похожее на примитивные типы (целое, двойное и т. д.).

  • Размер экземпляра меньше 16 байтов.

  • Неизменен.

  • Упаковывать его не нужно часто.

Вы действительно часто разрабатываете типы со всеми этими характеристиками?

4 голосов
/ 13 марта 2009

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

0 голосов
/ 13 марта 2009

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

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

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

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

0 голосов
/ 13 марта 2009

Задайте себе следующие вопросы о наборе данных, который вы моделируете с помощью структуры:

  • Может, когда-нибудь понадобится получить / установить логику?
  • Может, когда-нибудь понадобится хранить ЛЮБУЮ логику что характерно для данных?
  • Может быть, нужно наследовать другой набор данных?
  • Возможно, другой набор данных должен унаследовать это?

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

0 голосов
/ 13 марта 2009

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

Во многих отношениях вы можете думать о структурах в C # как о сокращенных классах. Они в основном такие же, как классы, но больше предназначены для случаев, когда вы просто хотите сгруппировать некоторые данные вместе. Oни отличаются от классов следующими способами: Некоторые вещи, которые нужно иметь в виду

  • Структуры являются типами значений, а не ссылочные типы. Это означает, что они хранится либо в стеке, либо в линия (если они являются частью другого объект, который хранится в куче) и имеют одинаковую продолжительность жизни ограничения как простые данные типы.
  • Структуры не поддерживают наследование.
  • Есть некоторые различия в Как конструкторы работают на структуры. В частности, компилятор всегда предоставляет параметр по умолчанию no - конструктор, которым вы не являетесь разрешено заменить.
0 голосов
/ 13 марта 2009

Я думаю, что основная цель структуры - хранить только переменные типы. Если вы сохраняете некоторые классы в struct - вы ошибаетесь.

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