Я только что отладил проблему с функцией, которая возвращает строку, которая меня обеспокоила. Я всегда предполагал, что неявная переменная 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;