【发布时间】:2011-03-16 02:47:06
【问题描述】:
我刚刚调试了一个函数的问题,该函数返回一个让我担心的字符串。我一直假设返回字符串的函数的隐式 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;
多次调用该函数导致:
"Some Text"
第一次,
"Some Text"
"Some Text"
第二次,
"Some Text"
"Some Text"
"Some Text"
第三次等
要修复它,我必须初始化结果:
begin
Result := '';
if(ACondition) then
AppendInfo('Some Text');
end;
是否需要初始化字符串函数结果?为什么(技术上)?为什么编译器不会为字符串函数发出警告“W1035 函数 'xxx' 的返回值可能未定义”?我是否需要检查所有代码以确保设置了一个值,因为如果未明确设置结果,则期望函数中的空字符串是不可靠的?
我已经在一个新的测试应用程序中对此进行了测试,结果是一样的。
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
S: string;
begin
for i := 1 to 5 do
S := GenerateInfo;
ShowMessage(S); // 5 lines!
end;
【问题讨论】:
-
我在返回接口的函数中遇到了类似的情况。需要初始化的数据类型似乎存在一个普遍问题。我没有尝试过动态数组,但我想这也会显示这个问题。
标签: delphi compiler-warnings delphi-2007