假设您有一个要初始化的本地记录:
type
TMyRec=record
Val1, Val2:Integer;
end;
procedure MyProc;
var
MyVar:TMyRec;
begin
// ... ?
WriteLn(Val1,Val2);
end;
除了“手动”设置每个字段外,还有几种方法可以做到这一点。
Initialize(MyVar);
MyVar := Default(TMyVar);
FillChar(MyVar,SizeOf(MyVar),0);
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)
分配给变量时,编译器会生成非常有效的代码。