加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:09:25 所属栏目:大数据 来源:网络整理
导读:我在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:
我在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);

我的假设是否正确?

解决方法

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用于类,接口和匿名方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读