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