Cómo pasar un parámetro (o varios) por referencia en un método (procedimiento, función) de C Sharp (C#). Utilizaremos Microsoft Visual Studio Community 2019 y mostraremos un ejemplo donde usamos este paso de parámetros por referencia, de procedimiento que separa un texto en dos variables, hasta el primer espacio el comando y todo lo demás el valor de este comando.

Método en C# que devuelve un string y una variable string pasada por referencia

A continuación mostramos el código fuente en C# de un ejemplo de método al se se le pasa como parámetro «normal» un texto (string) y se le pasa también un parámetro «especial», por referencia, en el que el método devuelve un valor.

Llamada a método que recibe parámetro por referencia en C#

Para llamar y usar el método (función) anterior, ObtenerAccion, un ejemplo:

Explicación del funcionamiento del uso de parámetros pasados por referencia en C#

En el ejemplo anterior, de método con parámetro por referencia y uso de este método, se realizan las siguientes acciones:

  • Para crear el método, se especifica en su declaración, la palabra reservada ref delante de la variable que será el parámetro que se devuelva posteriormente:

public string ObtenerAccion(string mensaje, ref string parametro)

El resto de variables se declararán de forma normal. Además de ref, se puede usar también la palabra reservada out, la única diferencia es que si se usa out, se obliga al compilador a verificar que la variable con esta palabra clave tenga un valor, en caso contrario dará error de compilación.

Al declarar un parámetro de un método con la palabra reservada ref, estamos indicando, básicamente, que en lugar de recibir el valor de esa variable cuando se llame al método, será al contrario, el método pasará un valor a esa variable para que pueda recogerse desde la llamada.

  • En el código del método que contiene el parámetro declarado con ref, el tratamiento es como una variable normal, durante la ejecución del código, en alguna línea, la variable debe tomar un valor, que será el que se reciba posteriormente en su llamada. Es como hacer un return para una variable. En el ejemplo, el método ObtenerAccion, espera un parámetro en su llamada, mensaje, que es un texto. Divide el texto en dos, la primera división hasta el primer espacio que encuentre. Devuelve esta primera división (comando) por el return, de forma normal para un método que devuelve un valor string. Y, de forma adicional, devuelve también por la variable de referencia parametro, la segunda parte de la división del texto que realiza.

Para entenderlo mejor aún, haremos un ejemplo, supongamos que pasamos al método:

ObtenerAccion («Esto es una prueba de paso de parámetro por referencia», valor)

El método ObtenerAccion devolverá cuando sea llamado, por un lado:

ObtenerAccion = Esto

Y por otro, la variable que se declare como referencia, devolverá el resto del texto:

valor = es una prueba de paso de parámetro por referencia

Por lo tanto, en el ejemplo de llamada anterior:

Si la variable mensajeOriginal tiene el valor «Esto es una prueba», quedará:

  • comando = «Esto»
  • valor = «es una prueba»

Para qué sirve el paso de parámetros por referencia, otro ejemplo

Como hemos visto en el ejemplo, el paso de parámetros por referencia se usa cuando queremos que un método devuelva más de un valor, incluso varios valores de distinto tipo. En el ejemplo que hemos tratado en este artículo, el método ObtenerAccion devolvía un valor de forma normal, por return, y otro valor por referencia.

Imaginemos un método que queramos que devuelva un string, un integer, otro string y un float, podría ser algo así:

public MiMetodo (string pideTexto, ref string enviaTexto, ref int enviaNumero, ref string enviaTextoDos, ref float enviaFlotante)

El método anterior MiMetodo, en su código, establecerá los valores oportunos para enviaTexto, enviaNumero, enviaTextoDos y enviaFlotante. Cuando el método sea llamado, se recibirán estos valores en las variables declaradas a tal uso.

Con ello, el paso de parámetros por referencia, se hace muy útil para métodos que van a devolver varios valores de tipos iguales o diferentes.

A continuación exponemos otro ejemplo práctico:

Y un ejemplo de uso: