Paso de valores por referencia y por valor en C#

Cuando creas proyectos de código es importante que puedas manipular los valores de tus variables de la manera que mejor te interese y no en todos los casos esperas que el resultado sea el mismo. Las ventajas que tienes con esto es que podrías optimizar mucho tu funcionalidad y ahorrarte muchos dolores de cabeza.

Modificadores REF y OUT

Los modificadores ref y out son especialmente útiles para estos casos. Hagamos un ejemplo y veamos los resultados, para este caso, con una aplicación de consola tendremos más que suficiente (lo sé, no puedo ocultar mi amor por este tipo de apps!).

Ya que tengas creada la aplicación, crea algo como esto:

class Program
{
static void Main(string[] args)
{
int valorUno = 0;

MetodoSimple(valorUno);
Console.WriteLine(valorUno);

Console.ReadLine();
}

static void MetodoSimple(int valorRecibido)
{
valorRecibido = 1;
}
}

Podrás ver al ejecutar el programa que el resultado será el mismo que al inicio, es decir, cero, eso sucede porque el método cambió el valor del parámetro recibido, no cambia el valor de la variable.

Ahora, si hacemos el mismo ejemplo, pero agregamos el modificador ref en el parámetro del método y al invocarlo quedaría de la siguiente manera.

Hacer este cambio resultará en que la aplicación muestre el valor asignado a la variable después de haber pasado por el método y actualizando el dato de la variable, no del valor recibido, a esto se le llama paso por referencia.

Como puedes ver, ambos casos son sumamente diferentes y esto es lo que representa la gran posibilidad de opciones que te había mencionado. Ahora vamos al segundo modificador, la palabra out

El modificador out, es una forma de regresar un valor, algo así como con la palabra return, la gran diferencia es que return solo regresa un valor modificado, quizá en el mejor de los casos, un objeto. Sin embargo mediante out podrás devolver más de un valor y lo más importante es que lo asignas directamente a la variable, no a un nuevo valor recién creado.

Esto complica algunas otras cosas como las pruebas, reflección o implementación al principio, pero hay muchas ventajas en usarlo. Checa el ejemplo:

Suenan a lo mismo ¿no? Bueno, la gran diferencia esta en la aplicación del compilador y al asignar los valores definitivos. Cuando un método invoca al modificador out, el valor será definitivamente asignado.

Así que ahora, además de un simple return, tendrás más posibilidades de trabajar con los valores de tus variables y usarlos de la mejor manera que te convenga.

2 Comments

  • 31 mayo, 2017 - 9:29 pm | Permalink

    El buen Amin, te falto aclarar que esto aplica para las variables de ‘tipo de valor’, ya que las de ‘tipo de referencia’ estas se pasan por referencia por default (como su nombre lo indica).

    Saludos.

    • Amin Espinoza
      15 junio, 2017 - 9:32 am | Permalink

      Buena esta! Gracias por el dato!

  • Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    This blog is kept spam free by WP-SpamFree.