Skip to content

Son peligrosos los parámetros out?

Básicamente, el parámetro out es muy parecido al parámetro var, son variables de retornos. Pero los parámetros out poseen sus propios efectos secundarios, crean situaciones específicas que requieren una explicación adicional.

Como funciona un parámetro out

Un parámetro out es, como dijimos anteriormente, un parámetro var pero con pequeños agregados. Al igual que un parámetro var, el out pasa la variable original como referencia (puntero), pero éste último le comunica al compilador de que el valor se puede descartar, ya que no es para pasar ningún valor de entrada al procedimiento, y será utilizado solamente para devolver un resultado del procedimiento.

Para los tipos administrados, el compilador borrará el contenido original del parámetro out en el momento de la llamada.

procedure OutInteger(out Value: integer);
begin
  Value := 10;
end;

procedure OutString(out Value: string);
begin
  Value := '10';
end;

procedure SampleOut();
var
  vInt: integer;
  vStr: string;
begin
  vInt := 5;
  vStr := '5';

  OutInteger(vInt);
  WriteLn(vInt);
  OutString(vStr);
  WriteLn(vStr);
end;

{
Resultados:
  10
  10
}

En el ejemplo anterior corroboramos que el parámetro out, como su definición lo dice, solo sirve para devolver un resultado.

Ahora, si eliminamos el código de los procedimientos, corroboraremos que el parámetro out de tipo string se borrará al momento de llamar al procedimiento pero el de tipo integer no.

procedure OutInteger(out Value: integer);
begin
end;

procedure OutString(out Value: string);
begin
end;

procedure SampleOut();
var
  vInt: integer;
  vStr: string;
begin
  vInt := 5;
  vStr := '5';

  OutInteger(vInt);
  WriteLn(vInt);
  OutString(vStr);
  WriteLn(vStr);
end;

{
Resultados:
  5
   
}

Si al parámetro out lo combinamos con el parámetro const, podemos llegar a tener resultados inesperados:

procedure InOutString(const a: string; out b: string);
begin
  b := a + a;
end;

procedure Sample;
var
  vStr: string;
begin
  vStr := 'x';
  InOutString(vStr, vStr);
  Writeln(vStr);
end;

{
  Resultado:

}

A simple vista, esperamos un resultado igual a ‘xx’, pero como el compilador borra el parámetro out en el momento de la llamada al procedimiento, b := a + a nos da como resultado una cadena vacía porque a está vacía al momento de la llamada.

Ahora que pasa si reemplazamos el parámetro out con el parámetro var:

procedure InOutString(const a: string; var b: string);
begin
  b := a + a;
end;

procedure Sample;
var
  vStr: string;
begin
  vStr := 'x';
  InOutString(vStr, vStr);
  Writeln(vStr);
end;

{
  Resultado:
  xx
}

Vemos que el resultado es el esperado, porque en este caso, el compilador, al ser un parámetro var, no elimina el dato al momento de la llamada.

No vamos a poner todas la combinaciones de parámetros, eso queda para que tu practiques un poco.

Conclusión

Respondiendo la pregunta del título, de que si los parámetros out son peligrosos?, podemos afirmar que NO.

Solo debes saber como y donde utilizarlos al igual que los parámetros const y var.