如何初始化声明为局部变量的记录?

Posted

技术标签:

【中文标题】如何初始化声明为局部变量的记录?【英文标题】:How can I initialize a record declared as a local variable? 【发布时间】:2010-08-13 14:18:22 【问题描述】:

我在一个类的方法中使用由字符串、布尔值、整数、货币和其他记录数组组成的记录。我想递归地将原始类型的所有字段初始化为空/假/零。默认情况下,Delphi 似乎不这样做。有没有一种不涉及按名称访问每个字段并手动设置它的简单方法来完成此操作?

【问题讨论】:

请注意,Delphi 会初始化生命周期管理的类型(字符串、动态数组、接口)。 在 Delphi-2009 及更高版本中,记录可以由 Foo := Default(TFoo); 初始化。请参阅David's answer 到问题How to properly free records that contain various types in Delphi at once?。 另见:Which variables are initialized when in Delphi? 【参考方案1】:

您可以使用以下构造中的任一(其中 Foo 是一条记录)。

FillChar(Foo, SizeOf(Foo), 0); 

ZeroMemory(@Foo, SizeOf(Foo));

来自Allen Bauer的帖子

在查看最常见的用途时 对于 FillChar 以确定 大多数人是否使用 FillChar 实际上用字符填充内存 数据或仅使用它来初始化 具有某些给定字节值的内存,我们 发现是后一种情况 主导了它的使用,而不是 前任的。有了这个,我们决定保留 FillChar 以字节为中心。

【讨论】:

或具有(可能)更好可读性的相同代码:ZeroMemory(@Foo, SizeOf(Foo)); @Im0rtality:我已更新答案以包含您的 ZeroMemory 解决方案。 请注意,ZeroMemory 是 Delphi 某些 版本(至少 d6 和 7)中 FillChar 的包装器。【参考方案2】:

注意,you should use Finalize before FillChar or ZeroMemory in some cases。

【讨论】:

【参考方案3】:

好吧,你可以应用一个简单的法律技巧

unit unit1;

interface

type
  PMyRecord = ^TMyRecord;
  TMyRecord = record
    Value: Integer;
    function Self: PMyRecord;
  end;

implementation

function TMyRecord.Self: PMyRecord;
begin
  Result := @Self;
end;

procedure Test(AValue: Integer);
const MyRecord: TMyRecord = (Value: 0);
begin
  MyRecord.Self.Value := AValue;
end;

【讨论】:

以上是关于如何初始化声明为局部变量的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有扩展内联 asm 的情况下在 gcc 内联汇编中声明和初始化局部变量?

局部变量和全局变量

KEIL中全局变量,变量类型,LED灯,勿在中断延时

Java 变量类型

EffectiveJava-1

Java变量类型