Книга: C# для профессионалов. Том II
Структуры
Структуры
Одним из основных различий между структурой C# (идентифицируемой ключевым словом struct
) и классом является то, что то умолчанию struct
передается посредством значения, в то время как объект передается по ссылке. Как хорошо известно, объекты создаются в куче, в то время как переменные, которые на них ссылаются, хранятся в стеке. Структуры, со своей стороны, создаются и хранятся в стеке. Их аналога в Java не существует. Структуры имеют конструкторы и методы, у них могут быть индексаторы, свойства, операторы и даже вложенные типы. С помощью struсt
создаются типы данных, которые ведут себя таким же образом, как встроенные типы. Ниже приведен пример использования структур:
public struct WroxInt {
int internalVal;
private WroxInt(int x) {
internalVal = x;
}
public override string ToString() {
return Int.ToString(internalVal);
}
public static impicit operator WroxInt(int x) {
return new WroxInt(x);
}
}
public static void UseWroxInt() {
WroxInt wi = 90;
Console.WriteLine(wi);
}
Этот пример показывает типы, которыми владеют мощные структуры. WroxInt
используется почти так же, как и встроенный тип int
. Как известно, не существует способа сделать что-нибудь подобное в Java. Ряд других достоинств и ограничений, связанных с использованием структур, представлен ниже:
? struct
нельзя наследовать от другой struct
или от класса.
? struct
не является базой для класса
? Хотя struct
может oбъявлять конструкторы, эти конструкторы должны получать не меньше одного аргумента.
? Члены struct
не могут иметь инициализаторов.
? Возможно создание экземпляра struct
без использования ключевого слова new
.
? struct
может реализовывать интерфейсы.
Атрибуты используются со структурами чтобы добавить им дополнительную мощь и гибкость. Атрибут StructLayout
в пространстве имен System.Runtime.InteropServices
, например, применяется для определения компоновки полей в struct
. Это свойство подходит и для создания структуры, аналогичной по функциональности union
в С/C++, union
является типом данных, члены которого находятся в одном блоке памяти. Он может использоваться для хранения значений различных типов в одном блоке памяти. union
годится и в том случае, когда неизвестно, каким будет тип полученных значений. Конечно, никакого рeaльного преобразования не происходит, фактически не существует никакие базовых проверок допустимости данных. Один и тот же набор битов интерпретируется различным образом. Рассмотрим пример того, как union
создается с помощью struct
:
[StructLayout(LayoutKind.Explicit)]
public struct Variant {
[FieldOffset(0)] public int intVal;
[FieldOffset(0)] public string stringVal;
[FieldOffset(0)] public decimal decVal;
[FieldOffset(0)] public float floatVal;
[FieldOffset(0)] public char charVal;
}
Атрибут FieldOffset
, применяемый к полям, используется для задания физического расположения указанного поля. Задание начальной точки каждого поля как 0 гарантирует, что любое сохранение данных в одном поле перезапишет практически любые данные, которые там находятся. Отсюда следует, что общий размер полей равен размеру наибольшего поля, в данном случае decimal
.
- 1.4 Структуры данных, связанные с драйверами устройств Windows
- ВЛОЖЕННЫЕ СТРУКТУРЫ
- Практическая работа 35. Создание структуры документа и вставка оглавления
- Разработка структуры базы данных
- 6.2. Типы и структуры данных
- Ветвящиеся структуры – архитектура мира растений
- Построение структуры веб-страницы
- Фундаментальные алгоритмы и структуры данных в Delphi
- 4.2. Представление базовой структуры программы
- 14. Структуры и другие типы данных
- Структуры данных процесса
- Структуры данных