Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи. Тип записи конструируется следующим образом:
recordсписок полей
список методов
end
Приведем пример записи, содержащей только поля:
type
SexType = (male, female);
Person = record
Name: string;
Age, Weight: integer;
Sex: SexType;
end;
При описании переменной или константы типа запись можно использовать инициализатор записи (как и в Object Pascal):
const p: Person = (Name: 'Петрова'; Age: 18; Weight: 55; Sex: female);
var p: Person := (Name: 'Иванов'; Age: 20; Weight: 80; Sex: male);
Присваивание записей копирует содержимое полей одной переменной-записи в другую:
d2 := d1;
Для записей принята именная эквивалентность типов: можно присваивать друг другу и передавать в качестве параметров подпрограмм записи, совпадающие только по имени.
В отличие от Object Pascal, в PascalABC.NET отсутствуют записи с вариантами.
Помимо полей, внутри записей могут содержаться также методы и свойства. Таким образом, записи очень близки к классам.
Список отличий между записями и классами приводятся ниже:
System.ValueType и
реализуется struct-типом.Конструкторы для записей имеют тот же синтаксис, что и для классов. Однако, в отличие от классов, вызов конструктора записи не создает новый объект в динамической памяти, а только инициализирует поля записи.
По умолчанию процедура write для переменной типа запись выводит
ее тип. Чтобы изменить это поведение, в записи следует переопределить метод
ToString класса Object.
Например:
type
SexType = (male, female);
Person = record
private
Name: string;
Age, Weight: integer;
Sex: SexType;
public
constructor Create(Name: string; Age, Weight: integer; Sex: SexType);
begin
Self.Name := Name;
Self.Age := Age;
Self.Weight := Weight;
Self.Sex := Sex;
end;
function ToString: string; override;
begin
Result := string.Format('Имя: {0} Возраст: {1} Вес: {2} Пол: {3}',
Name, Age, Weight, Sex);
end
end;
...
var p: Person := new Person('Иванов',20,70,Sex);
writeln(p);