He estado depurando un problema con una función que devuelve una cadena que me preocupa. Siempre he asumido que la variable de resultado implícito para las funciones que devuelven una cadena estaría vacía al inicio de la llamada de función, pero el (simplificado) siguiente código producido un resultado inesperado:¿Inicia el resultado de la función de cadena?
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;
Al llamar a este múltiple función veces resultaron en:
"Some Text"
primera vez,
"Some Text"
"Some Text"
el segundo tiempo,
"Some Text"
"Some Text"
"Some Text"
tercera vez, etc.
Para solucionarlo tuve que inicializar el Resultado:
begin
Result := '';
if(ACondition) then
AppendInfo('Some Text');
end;
¿Es necesario inicializar un resultado de la función de cuerdas? ¿Por qué (técnicamente)? ¿Por qué el compilador no emite una advertencia "W1035 El valor de retorno de la función 'xxx' podría estar indefinido" para las funciones de cadena? ¿Debo revisar todo mi código para asegurarme de que se establece un valor, ya que no es confiable esperar una cadena vacía de una función si el resultado no está establecido explícitamente?
He probado esto en una nueva aplicación de prueba y el resultado es el mismo.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
S: string;
begin
for i := 1 to 5 do
S := GenerateInfo;
ShowMessage(S); // 5 lines!
end;
Experimenté algo similar con una función que devuelve una interfaz. Parece que hay un problema general con los tipos de datos que requieren inicialización. No he intentado arreglos dinámicos pero supongo que también mostraría este problema. – dummzeuch
+1 para una muy buena pregunta. –