我是Delphi的新手,我一直在运行一些测试来查看默认情况下初始化了哪些对象变量和堆栈变量:
TInstanceVariables = class
fBoolean: boolean; // always starts off as false
fInteger: integer; // always starts off as zero
fObject: TObject; // always starts off as nil
end;
Run Code Online (Sandbox Code Playgroud)
这是我习惯使用其他语言的行为,但我想知道在Delphi中依赖它是否安全?例如,我想知道它是否可能依赖于编译器设置,或者可能在不同的机器上以不同的方式工作.依赖于对象的默认初始化值是正常的,还是在构造函数中显式设置所有实例变量?
至于堆栈(过程级)变量,我的测试显示单位化布尔值为真,单位化整数为2129993264,未初始化对象只是无效指针(即不是nil).我猜测规范是在访问它们之前始终设置过程级变量?
我刚刚调试了一个函数,它返回一个让我担心的字符串.我一直认为返回字符串的函数的隐式Result变量在函数调用开始时将为空,但以下(简化)代码产生了意外的结果:
function TMyObject.GenerateInfo: string;
procedure AppendInfo(const AppendStr: string);
begin
if(Result > '') then
Result := Result + #13;
Result := Result + AppendStr;
end;
begin
if(ACondition) then
AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)
多次调用此函数导致:
"Some Text"
Run Code Online (Sandbox Code Playgroud)
第一次,
"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)
第二次,
"Some Text"
"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)
第三次等
要修复它,我必须初始化结果:
begin
Result := '';
if(ACondition) then
AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)
是否需要初始化字符串函数结果?为什么(技术上)?为什么编译器不会发出警告"W1035函数的返回值'xxx'可能是未定义的"字符串函数?我是否需要遍历所有代码以确保设置值,因为如果未明确设置结果,则期望函数中的空字符串不可靠?
我在一个新的测试应用程序中对此进行了测试,结果是一样的.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
S: string;
begin
for i := 1 to 5 do
S := GenerateInfo;
ShowMessage(S); // 5 …Run Code Online (Sandbox Code Playgroud)