Un parámetro de salida se diferencia de uno de entrada en que todo
cambio que se le realice en el código
del método al que pertenece afectará al objeto que se le pase al llamar dicho
método tanto si éste es de un tipo por como si es de un tipo referencia. Esto
se debe a que lo que a estos parámetros se les pasa es siempre una referencia
al valor que almacenaría una variable
del tipo del objeto que se les pase.
Cualquier parámetro de salida de
un método siempre ha de modificarse dentro del cuerpo del método y además dicha
modificación ha de hacerse antes que cualquier lectura de su valor. Si esto no
se hiciese así el compilador lo detectaría e informaría de ello con un error.
Por esta razón es posible pasar parámetros de salida que sean variables no inicializadas,
pues se garantiza que en el método se inicializarán antes de leerlas. Además, tras la llamada a un método se
considera que las variables que se le pasaron como parámetros de salida ya
estarán inicializadas, pues dentro del método seguro que se las inicializació.
Nótese que este tipo de
parámetros permiten diseñar métodos que devuelvan múltiples objetos: un objeto
se devolvería como valor de retorno y los demás se devolverían escribiendos en
los parámetros de salida.
Los parámetros de salida se definen
de forma parecida a los parámetros de entrada pero se les ha de añadir la
palabra reservada out. O sea, se definen así:
out <tipoParámetro>
<nombreParámetro>
Al llamar a un método que tome
parámetros de este tipo también se ha preceder el valor especificado para estos
parámetros del modificador out. Una utilidad de esto es facilitar la
legibilidad de las llamadas a métodos. Por ejemplo, dada una llamada de la
forma:
a.f(x, out z)
Es fácil determinar que lo que se
hace es llamar al método f() del objeto
a pasándole x como parámetro de entrada y z
como parámetro de salida. Además, también se puede deducir que el valor de z cambiará tras la llamada.
Sin embargo, la verdadera
utilidad de forzar a explicitar en las llamadas el tipo de paso de cada
parámetro es que permite evitar errores derivados de que un programador pase
una variable a un método y no sepa que el método la puede modificar. Teniéndola
que explicitar se asegura que el programador sea consciente de lo que hace.