Delphi" default " ключевое слово с типами записей в старых версиях Delphi

у меня есть этот код в библиотеке объездов Delphi, которую я пытаюсь портировать:

type
  TInstruction = record
    Archi: Byte; { CPUX32 or CPUX64 ! }
    AddrMode: Byte; { Address Mode }
    Addr: PByte;
    VirtualAddr: PByte;
    NextInst: PByte; { Pointer to the Next Instruction }
    OpCode: Byte; { OpCode Value }
    OpType: Byte;
    OpKind: Byte;
    OpTable: Byte; { tbOneByte,tbTwoByte,... }
    OperandFlags: Byte;
    Prefixes: Word; { Sets of Prf_xxx }
    ...
  end;

var
  Inst: TInstruction;
begin
  ...
  Inst := default (TInstruction); // <-
  Inst.Archi := CPUX;
  Pvt := PPointer(AIntf)^; // vTable !
  PCode := PPointer(Pvt + Offset)^; // Code Entry !
  Inst.NextInst := PCode;
  ...
end;

что значит "default" ключевое слово делать? Я!--6-->предположим что-то типа:

FillChar(Inst, SizeOf(TInstruction), 0);

правильно ли мое предположение?

1 ответов


Default() - недокументированная внутренняя функция, введенная для поддержки дженериков. Дизайн Delphi generics был сильно вдохновлен .NET generics, и вы можете извлечь выгоду из чтения analagous документации для .net:https://msdn.microsoft.com/en-GB/library/xwth0h0d.aspx

цель Default() позволяет инициализировать переменную по умолчанию. При работе с универсальными типами Default() позволяет сделать это для переменной, тип которой является универсальным.

если вы хотите воспроизвести поведение Default() сделать следующее:

Finalize(Inst);
FillChar(Inst, SizeOf(Inst), 0);

вызов Finalize необходимо в случае, если тип управляется. То есть, если тип управляется или содержит какие-либо управляемые члены. Управляемые типы включают строки, динамические массивы, интерфейсы, варианты, анонимные методы и т. д.

если тип не содержит управляемых типов, то вызов Finalize можно опустить. Это не помешает включить его, Хотя, потому что компилятор устранит его, если он не нужен. Если вы можете быть на 100% уверены, что управляемым типам не назначено значение, вы также можете опустить этот вызов.

инициализация по умолчанию означает следующее:

  • ноль для числовых типов.
  • значение с порядковым нулем для перечисленных типов.
  • False для логического типа.
  • #0 для символьных типов.
  • пустая строка для веревка.
  • пустой вариант Variant.
  • nil для классов, динамических массивов, интерфейсов и анонимных методов.