4.5 Инициализация переменных (по умолчанию)

На верх  Назад  Вперёд

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

Для этого компилятор содержит внутреннюю функцию Default. Эта функция принимает идентификатор типа в качестве аргумента, и возвращает правильно инициализированную переменную этого типа. По сути, функция обнулит всю переменную.

Ниже приведен пример её использования:

type

TRecord = record

  i: LongInt;

  s: AnsiString;

end;

 

var

i: LongInt;

o: TObject;

r: TRecord;

begin

i := Default(LongInt); // 0

o := Default(TObject); // Nil

r := Default(TRecord); // ( i: 0; s: '')

end.

Случай, когда переменная выделяется в куче, более интересен:

type

TRecord = record

  i: LongInt;

  s: AnsiString;

end;

 

var

i: ^LongInt;

o: ^TObject;

r: ^TRecord;

begin

i:=GetMem(SizeOf(Longint));

i^ := Default(LongInt); // 0

o:=GetMem(SizeOf(TObject));

o^ := Default(TObject); // Nil

r:=GetMem(SizeOf(TRecord));

r^ := Default(TRecord); // ( i: 0; s: '')

end.

Это функция работает для всех типов, кроме различных типов файлов (или сложных типов, содержащих тип файла).

Примечание:

Это особенно полезно для значений по умолчанию (Default) для дженериков, потому, что тип переменных неизвестен во время объявления дженерика. Для получения дополнительной информации см. раздел 8.7 Инициализация по умолчанию