Delphi“default”关键字,旧版Delphi版本中包含Record类型

时间:2016-07-15 10:03:18

标签: delphi delphi-7 delphi-5

我在Delphi Detours库中有这个代码,我正试图移植:

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”关键字的作用是什么? 我假设类似于:

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

我的假设是否正确?

1 个答案:

答案 0 :(得分:13)

Default()是一个无证的内在函数,用于支持泛型。 Delphi泛型的设计深受.net泛型的启发,您可以从阅读.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用于类,动态数组,接口和匿名方法。