Я знаю что-то о struct
ввести. Но я не могу понять:для чего это? когда я сделал, используют его? Классы, простые типы значения и перечисления - это - все, в чем я нуждаюсь.
Какие-либо предложения?
UPD:Пожалуйста! не говорите мне, что структура находится в стеке (я знаю это :). Для чего структура?
Вы выбираете структуру, если вам нужна семантика типа value. Вы выбираете класс, если вам нужна семантика ссылочного типа. Все остальные вопросы являются вторичными по отношению к этому.
.Вы можете использовать структуры, когда вам нужен "класс" со смысловой (а не ссылочной) семантикой.
.MSDN предлагает руководство : Выбор между классами и структурами:
Рассмотрим вопрос об определении структуры вместо класса, если экземпляры этого типа небольшие и обычно недолговечные или обычно встраиваются в другие объекты.
Не определяйте структуру, если только тип не имеет всех следующих характеристик:
- Логически он представляет одно значение, похожее на примитивные типы (целое, двойное, > и т.д.)
- Размер экземпляра меньше 16 байт.
- Он непреложен.
- Его не нужно часто опрашивать.
Простые типы значений лучше всего реализовывать через структуру.
Struct Usage Guidelines
Рекомендуется использование структурировать для типов, которые соответствуют любому из следующие критерии:
* Действовать как примитивные типы. * Имеют размер экземпляра менее 16 байт. * незыблемы. * Ценностная семантика желательна. Вы также должны понимать, что экземпляр класса выделяется на куче. Структура - это тип vallue - и выделяется на стеке..
Если вы не знаете, зачем вам это нужно, то, скорее всего, не знаете.
struct - это тип значения, а не ссылочный тип. Если вы не знаете, что это значит, то, скорее всего, она вам не понадобится.
Вещи, которые должны быть структурой (потому что они являются значениями):
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();
?
Используйте здесь принцип минимального удивления.
.Сначала необходимо понять разницу между типом значения и типом ссылки. Я буду считать, что раз вы сказали пропустить эту часть, то вы понимаете, что это такое.
Структура - это тип значения, и вы получаете все привилегии, которые вы получите, работая со значением типа.
Структуры передаются по значению. Когда вы делаете что-то вроде
DateTime time = new DateTime(); DateTime newTime = время; // вы не ссылаетесь на время // вместо этого вы создали новый экземпляр
Структуры не являются легковесными классами, у них может быть много методов, просто посмотрите на структуру DateTime
.
Структуры могут быть легче в исполнении, но не всегда. Рассмотрим вариант передачи в метод большой структуры. Так как структуры являются типами значений каждый раз, когда вы передаете одну в метод, создается новая инстанция структуры, а значит, каждый раз копируется структура. Если у вас достаточно большая структура, то это будет гораздо больший хит производительности.
Время от времени вам могут понадобиться боксные и распаковочные структуры, так как они являются типами значений.
Короче говоря, используйте структуру для представления атомарного значения в памяти.
структуры предназначены для объектов, которые представляют собой нечто, чья идентичность определяется значениями, хранящимися в их свойствах, а не Id или ключом. Они называются "Типы ценностей", в отличие от объектов, называемых "Типы сущностей", чья идентичность сохраняется во времени и не зависит от значений свойств объекта.
Например, класс Человека (Entity) имеет идентичность, которая сохраняется из одного сеанса в другой, даже из года в год, несмотря на то, как адрес, телефон, работодатель и т.д. Человека может меняться из одного экземпляра в другой. Если вы случайно имеете в памяти одновременно два экземпляра класса Person, которые представляют одно и то же лицо/субъект, то важно, чтобы они имели одни и те же значения для своих свойств.
Объект CalendarMonth otoh, (тип значения) имеет только идентичность, определяемую значением, определяющим, какой это календарный месяц... сколько бы экземпляров "Март 2009" вы ни использовали, все они взаимозаменяемы и эквивалентны. Другим примером может служить объект, представляющий собой обозначение "FiscalYear" в налоговой программе. Отличный пример - объект адреса. (Здесь речь не идет об ассоциировании адреса с лицом или предприятием, или любым другим субъектом, а только с самим адресом). Изменение практически любого свойства адреса делает его другим адресом. Как только вы создаете объект с адресом в памяти, он эквивалентен и взаимозаменяем с любым другим объектом с адресом, который имеет те же самые свойства. Поэтому эти типы значений, как правило, должны быть неизменными. Когда он вам нужен, создайте новый объект со значением свойства, которое вам нужно, и выбросьте его, когда закончите его использовать.
Пример: Скажем, вы хотите, чтобы тип данных представлял координаты по X Y Z. На самом деле вам не нужна функциональность, только три переменные. Для этого подойдет структура, класс может быть переборщиком
.На самом деле, я думаю, что структура - это наследие от К. Я не думаю, что мы ДОЛЖНЫ использовать ее в каких бы то ни было условиях. Возможно, когда-нибудь вы почувствуете, что оставлять что-то на стеке, а не на куче более эффективно; но так как Java/C# никогда не принимает эффективность как свою первую позицию, то просто пренебрегайте этим:). Это мое мнение.