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
для классов, динамических массивов, интерфейсов и анонимных методов.