структура - для чего это?

Я знаю что-то о struct ввести. Но я не могу понять:для чего это? когда я сделал, используют его? Классы, простые типы значения и перечисления - это - все, в чем я нуждаюсь.

Какие-либо предложения?

UPD:Пожалуйста! не говорите мне, что структура находится в стеке (я знаю это :). Для чего структура?

7
задан lak-b 28 December 2009 в 19:00
поделиться

10 ответов

Вы выбираете структуру, если вам нужна семантика типа value. Вы выбираете класс, если вам нужна семантика ссылочного типа. Все остальные вопросы являются вторичными по отношению к этому.

.
22
ответ дан 6 December 2019 в 04:49
поделиться

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

.
3
ответ дан 6 December 2019 в 04:49
поделиться

MSDN предлагает руководство : Выбор между классами и структурами:

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

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

  • Логически он представляет одно значение, похожее на примитивные типы (целое, двойное, > и т.д.)
  • Размер экземпляра меньше 16 байт.
  • Он непреложен.
  • Его не нужно часто опрашивать.
9
ответ дан 6 December 2019 в 04:49
поделиться

Простые типы значений лучше всего реализовывать через структуру.

Struct Usage Guidelines

Рекомендуется использование структурировать для типов, которые соответствуют любому из следующие критерии:

* Действовать как примитивные типы.
* Имеют размер экземпляра менее 16 байт.
* незыблемы.
* Ценностная семантика желательна.
Вы также должны понимать, что экземпляр класса выделяется на куче.
Структура - это тип vallue - и выделяется на стеке.

.
4
ответ дан 6 December 2019 в 04:49
поделиться

Если вы не знаете, зачем вам это нужно, то, скорее всего, не знаете.

struct - это тип значения, а не ссылочный тип. Если вы не знаете, что это значит, то, скорее всего, она вам не понадобится.

1
ответ дан 6 December 2019 в 04:49
поделиться

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

  • struct Color
  • struct Point
  • struct Rectangle
  • struct GLVertex (содержит местоположение, цвет, нормальный и текстовый штрих)
  • struct DateTime

Вещи, которые должны быть классом (потому что они являются вещами, к которым вы обращаетесь):

  • класс RandomGenerator
  • класс Socket
  • класс Thread
  • класс Window

Почему? Рассмотрим следующий код.

class Button
{
    public Point Location { get; set; }
}

class Program
{
    public static void Main()
    {
        var button = Util.GetButtonFromSomewhere();
        var location = button.Location;
        Util.DrawText("one", location);
        location.Y += 50;
        Util.DrawText("two", location);
        location.Y += 50;
        Util.DrawText("three", location);
    }
}

В результате будет нарисовано 3 текстовых метки, выровненных по вертикали. Но если Point - это класс, то это также переместит кнопку, что действительно неожиданно: var location = button.Location считает, что нужно скопировать значение, а не ссылку! Другими словами, мы думаем о Точке как о типе значения, а не как о типе ссылки. "Значение" здесь используется в математическом смысле значения . Рассмотрим число 5, это абстрактный объект "где-то там", вы просто "ссылаетесь" на него. Точно так же Точка просто является. Она нигде не находится, мы не можем ее изменить. Поэтому мы решили сделать его структурой, чтобы пользователи ожидали семантики.

С другой стороны, мы могли бы иметь класс Кнопка { public Window Parent { get; set; } }. Здесь Родительский является сущностью, поэтому мы представляем его с типом ссылки - Окно. Возможно, имеет смысл использовать код вида myButton.Parent.Redraw();. Так что Window должен быть классом.

Пока все хорошо. Но все это, вероятно, звучит слишком расплывчато для вас. Как Вы на самом деле решаете, что-то "чувствуется", как ссылка или значение? Мое эмпирическое правило простое:

Что должен делать Foo a = b; a.Mutate();?

  • Если кажется, что это должно оставить b без изменений, сделайте Foo структурой.
  • Иначе сделайте его классом.

Используйте здесь принцип минимального удивления.

.
5
ответ дан 6 December 2019 в 04:49
поделиться

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

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

  • Структуры передаются по значению. Когда вы делаете что-то вроде

    DateTime time = new DateTime(); DateTime newTime = время; // вы не ссылаетесь на время // вместо этого вы создали новый экземпляр

  • Структуры не являются легковесными классами, у них может быть много методов, просто посмотрите на структуру DateTime.

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

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

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

4
ответ дан 6 December 2019 в 04:49
поделиться

структуры предназначены для объектов, которые представляют собой нечто, чья идентичность определяется значениями, хранящимися в их свойствах, а не Id или ключом. Они называются "Типы ценностей", в отличие от объектов, называемых "Типы сущностей", чья идентичность сохраняется во времени и не зависит от значений свойств объекта.

Например, класс Человека (Entity) имеет идентичность, которая сохраняется из одного сеанса в другой, даже из года в год, несмотря на то, как адрес, телефон, работодатель и т.д. Человека может меняться из одного экземпляра в другой. Если вы случайно имеете в памяти одновременно два экземпляра класса Person, которые представляют одно и то же лицо/субъект, то важно, чтобы они имели одни и те же значения для своих свойств.

Объект CalendarMonth otoh, (тип значения) имеет только идентичность, определяемую значением, определяющим, какой это календарный месяц... сколько бы экземпляров "Март 2009" вы ни использовали, все они взаимозаменяемы и эквивалентны. Другим примером может служить объект, представляющий собой обозначение "FiscalYear" в налоговой программе. Отличный пример - объект адреса. (Здесь речь не идет об ассоциировании адреса с лицом или предприятием, или любым другим субъектом, а только с самим адресом). Изменение практически любого свойства адреса делает его другим адресом. Как только вы создаете объект с адресом в памяти, он эквивалентен и взаимозаменяем с любым другим объектом с адресом, который имеет те же самые свойства. Поэтому эти типы значений, как правило, должны быть неизменными. Когда он вам нужен, создайте новый объект со значением свойства, которое вам нужно, и выбросьте его, когда закончите его использовать.

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

Пример: Скажем, вы хотите, чтобы тип данных представлял координаты по X Y Z. На самом деле вам не нужна функциональность, только три переменные. Для этого подойдет структура, класс может быть переборщиком

.
1
ответ дан 6 December 2019 в 04:49
поделиться

На самом деле, я думаю, что структура - это наследие от К. Я не думаю, что мы ДОЛЖНЫ использовать ее в каких бы то ни было условиях. Возможно, когда-нибудь вы почувствуете, что оставлять что-то на стеке, а не на куче более эффективно; но так как Java/C# никогда не принимает эффективность как свою первую позицию, то просто пренебрегайте этим:). Это мое мнение.

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

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