Структуры отличаются от классов в следующих важных моментах:
Структуры являются размерными типами.
Все структурные типы неявно являются производными от класса System.ValueType.
При присваивании переменной структурного типа производится копирование исходного значения.
Значения по умолчанию для структурного типа получается путем присваивания значений по умолчанию всем ее размерным полям и значения Null всем ее ссылочным полям.
Для преобразования между структурами и типом Object производятся операции упаковки и распаковки.
Смысл Self для структур отличен от классов.
Определения полей в структурах не допускают использования инициализатора значения.
В структурах не допустимо определение экземплярного конструктора без параметров.
При присваивании значения переменной, тип которой является структурой, создается копию присваиваемого значения. Таким образом данное присваивание отличается от присваивания переменной ссылочного типа, когда производится копирование ссылки, а не значения.
Подобно присваиванию когда структура используется как параметр, передаваемый по значений, или как значение, возвращаемое функцией, происходит создание копии структуры. Структура может быть передана по ссылке с использованием параметров, передаваемых по ссылке, либо выходных параметров.
Когда свойство структуры используется в левой части оператора присваивания экземплярное выражение, соответствующее свойству, должно классифицироваться как переменная. Если экземплярное выражение классифицируется как значение, то возникает ошибка компиляции.
Struct UserStructure
Public Title: string;
Public Param1: integer;
Public Param2: double;
Constructor Create(STitle: string; Param1Value: integer; Param2Value: double);
Begin
Title := STitle;
Param1 := Param1Value;
Param2 := Param2Value;
End Constructor;
End Struct;
Sub Test();
Var
StructObj, StructObj1: UserStructure;
Begin
StructObj := New UserStructure("Пользовательская структура", 100, 3.14);
StructObj1 := StructObj;
StructObj1.Title := "Копия структуры с измененными значениями параметров";
StructObj1.Param1 := 200;
StructObj1.Param2 := 2.7;
End Sub;
См.также: