Я только что отлаживал проблему с помощью функции, которая возвращает строку, которая меня беспокоит. Я всегда предполагал, что неявная переменная 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 "может быть undefined" для строковых функций? Нужно ли мне переходить ко всему моему коду, чтобы убедиться, что значение установлено, так как ненадежно ожидать пустую строку от функции, если результат явно не установлен?
Я тестировал это в новом тестовом приложении, и результат тот же.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
S: string;
begin
for i := 1 to 5 do
S := GenerateInfo;
ShowMessage(S); // 5 lines!
end;