假设您有一个您想要初始化的本地记录:
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 Way tm 是什么? : - )
答案 0 :(得分:9)
永远不要将Initialize
用于局部变量。
初始化只能在Delphi代码中使用,其中变量是通过除新标准过程之外的其他方式动态分配的。
由于它不包含任何托管类型,因此它会针对您的记录进行优化。因此,我们可以抛弃此选项并将该字段缩减为三个竞争者。
其余三个竞争者对未初始化的局部变量都有相同的效果。但是,对具有托管成员的本地变量使用FillChar
是有风险的,例如:字符串,接口引用,变体等。如果已经初始化了托管成员,那么您将破坏引用计数机制。但是,如果您确定该记录尚未初始化,那么FillChar
是安全有效的,尽管看起来相当丑陋。就个人而言,我会拒绝FillChar
这个角色。
留下Default(T)
和常量赋值。在旧版本的Delphi中,您只能使用常量赋值。可以说,当你宣布常数时,常量赋值和FillChar
一样难看。因此,在现代Delphi版本中,我会选择Default()
,因为在我看来,它更简洁,读起来更好。
与discussed in a question covering similar ground一样,当您将Default(T)
分配给变量时,编译器会生成非常高效的代码。