Delphi "default" 关键字与旧 Delphi 版本中的记录类型
Delphi "default" keyword with Record types in older Delphi versions
我在 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
用于 类、动态数组、接口和匿名方法。
我在 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
用于 类、动态数组、接口和匿名方法。