我在 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
” 关键字做什么?
我assume就像是:
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
适用于类、动态数组、接口和匿名方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)