Initialize(),Default()和FillChar()之间的区别

时间:2013-01-05 20:40:12

标签: delphi initialization

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

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

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

  WriteLn(Val1,Val2);
end;

除了“手动”设置每个字段外,还有几种方法可以做到。

  1. 使用初始化():

    Initialize(MyVar);
    
  2. 使用默认():

    MyVar := Default(TMyVar);
    
  3. 使用 FillChar

    FillChar(MyVar,SizeOf(MyVar),0);
    
  4. 定义一个空常量,并将其分配给var

    const cMyVar:TMyVar=();  
    ...    
    MyVar := cMyVar;    
    
  5. 以上所有似乎都适用于这个例子。我想你甚至可以定义一个全局变量来初始化它。

    但有一种首选方法吗?或者在某些情况下,不建议使用上述任何一种情况,或者它根本不起作用?

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

1 个答案:

答案 0 :(得分:9)

永远不要将Initialize用于局部变量。

  

初始化只能在Delphi代码中使用,其中变量是通过除新标准过程之外的其他方式动态分配的。

由于它不包含任何托管类型,因此它会针对您的记录进行优化。因此,我们可以抛弃此选项并将该字段缩减为三个竞争者。

其余三个竞争者对未初始化的局部变量都有相同的效果。但是,对具有托管成员的本地变量使用FillChar是有风险的,例如:字符串,接口引用,变体等。如果已经初始化了托管成员,那么您将破坏引用计数机制。但是,如果您确定该记录尚未初始化,那么FillChar是安全有效的,尽管看起来相当丑陋。就个人而言,我会拒绝FillChar这个角色。

留下Default(T)和常量赋值。在旧版本的Delphi中,您只能使用常量赋值。可以说,当你宣布常数时,常量赋值和FillChar一样难看。因此,在现代Delphi版本中,我会选择Default(),因为在我看来,它更简洁,读起来更好。

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