假设您有一个要初始化的本地记录:

type
  TMyRec=record
    Val1, Val2:Integer;
  end;

procedure MyProc;
var
  MyVar:TMyRec;
begin
  // ... ?

  WriteLn(Val1,Val2);
end;

除了“手动”设置每个字段外,还有几种方法可以做到这一点。
  • 使用初始化():
    Initialize(MyVar);
    
  • 使用默认():
    MyVar := Default(TMyVar);
    
  • 使用 FillChar :
    FillChar(MyVar,SizeOf(MyVar),0);
    
  • 定义一个空的常量,并将其分配给var
    const cMyVar:TMyVar=();
    ...
    MyVar := cMyVar;
    

  • 以上似乎在此示例的情况下都有效。我猜您甚至可以定义一个全局变量来对其进行初始化。

    但是,有没有首选的方法?还是在某些情况下不建议使用上述任何方法,或者根本无法使用?

    简而言之,初始化本地堆栈变量的确定的Right Waytm是什么? :-)

    最佳答案

    切勿将 Initialize 用作局部变量。



    更重要的是,由于它不包含任何托管类型,因此将根据您的记录进行优化。因此,我们可以放弃此选项,并将领域减少到三个竞争者。

    其余三个竞争者对于未初始化的局部变量均具有相同的效果。但是,在具有托管成员的本地变量上使用FillChar是有风险的,例如字符串,接口(interface)引用,变体等。如果托管成员已经初始化,则您将中断引用计数机制。但是,如果您确定记录尚未初始化,那么FillChar是安全有效的,尽管在我看来看起来很丑。就个人而言,我将拒绝FillChar担任此角色。

    剩下Default(T)和常量分配。在较早版本的Delphi中,您只能使用常量分配。可以公平地说,在声明常量时,常量赋值与FillChar一样丑陋。因此,在我看来,在现代的Delphi版本中,我会选择Default(),因为它更简洁,可读性更好。

    discussed in a question covering similar ground一样,当您将Default(T)分配给变量时,编译器会生成非常有效的代码。

    10-05 18:09