【问题标题】:Delphi "default" keyword with Record types in older Delphi versionsDelphi“默认”关键字与旧版 Delphi 中的记录类型
【发布时间】:2016-07-15 10:03:18
【问题描述】:

我在尝试移植的 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);

我的假设正确吗?

【问题讨论】:

  • 它也完成/初始化托管类型的字段。
  • @LURD,我可以理解“初始化”部分。但它什么时候最终确定变量?
  • @zig 例如,如果删除的记录是最后一个引用,则从动态数组和字符串中清除内存。另一个例子是取消链接interface 类型的引用计数对象。请参阅 docwiki.embarcadero.com/Libraries/XE7/en/System.Finalize
  • Default 在 D2009 中引入,参见:stackoverflow.com/questions/8460037/…

标签: delphi delphi-7 delphi-5


【解决方案1】:

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 用于类、动态数组、接口和匿名方法。

【讨论】:

  • 编译器提示:[Hint] DDetours.pas(1919): Expression needs no Initialize/Finalize。那么,我应该简单地删除 Finalize(Inst); 还是应该关闭提示?
  • 由你决定。无论哪种方式都可以。我可能会删除 Finalize。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多