老版本的Delphi中,记录类型中的“default”关键字是什么意思?

10

我有一段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);

我的假设是否正确?


它还会对托管类型的字段进行最终化/初始化。 - LU RD
@LURD,我可以理解“初始化”部分。但是变量何时完成最终化? - zig
例如,在动态数组和字符串中清除内存,如果删除的记录是最后一个引用。另一个例子是取消链接“interface”类型的引用计数对象。请参见docwiki.embarcadero.com/Libraries/XE7/en/System.Finalize。 - Arioch 'The
2
Default是在D2009中引入的,请参见:https://dev59.com/Y2oy5IYBdhLWcg3wkO-h - Johan
1个回答

19

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%确定没有分配值给托管类型,则还可以省略该调用。

默认初始化意味着以下内容:

  • 数字类型为0。
  • 枚举类型为零序数值。
  • 布尔类型为False
  • 字符类型为#0
  • 字符串为空字符串。
  • Variant为空变量。
  • 类、动态数组、接口和匿名方法为nil

编译器提示:[Hint] DDetours.pas(1919): Expression needs no Initialize/Finalize。那么,我应该简单地删除 Finalize(Inst); 还是应该关闭提示? - zig
由你决定。无论哪种方式都可以。我可能会删除Finalize。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接