Está en la página 1de 3

Paso de parámetros por Valor o por Referencia (Ref, Out) en C#

Por Referencia

Una variable de tipo referencia no contiene directamente los datos, contiene una referencia
a ellos. El paso de parámetros por referencia permite a los miembros de funciones,
métodos, propiedades, indizadores, operadores y constructores, cambiar el valor de los
parámetros y hacer que ese cambio persista.

Para pasar un parámetro por referencia, se debe usar una de las palabras clave Ref u Out.
Por ejemplo:

static void Funcion1(Ref int dato)


{
// codigo...
}
.
static void Funcion2(Out int dato)
{
// codigo...
}

Para pasar un argumento a un parámetro Ref, primero debe inicializarse. Esto es diferente
de Out, cuyo argumento no tiene que inicializarse explícitamente antes de pasarlo.

Aunque Ref y Out se tratan de manera diferente en tiempo de ejecución, se tratan de la


misma manera en tiempo de compilación. Por consiguiente no se pueden sobrecargar los
métodos si un método toma un argumento Ref y el otro toma un argumento Out.

El siguiente ejemplo muestra como trabajar con Ref:

class EjemploRef
{
static void Funcion1(Ref int dato)
{
dato = 3;
}
static void Main()
{
int valor = 0; // Es necesario inicializar la variable
Funcion1(Ref valor); // Variable pasada por referencia
System.Console.WriteLine("El valor es: {0}", valor); // valor a
cambiado a 3
}
}

Como se dijo anteriormente, Out no requiere que se inicialice la variable antes de pasarla.
Al utilizar un parámetro Out, la definición de método y el método de llamada deben utilizar
explícitamente la palabra clave out.

El siguiente ejemplo muestra como trabajar con Out:

class EjemploOut
{
static void Funcion2(Out int dato)
{
dato = 3;
}
static void Main()
{
int valor; // No es necesario inicializar la variable
Funcion2(Out valor); // Variable pasada por referencia
System.Console.WriteLine("El valor es: {0}", valor); // valor a
cambiado a 3
}
}

Por Valor

Una variable de tipo de valor contiene directamente los datos, a diferencia de una variable
de tipo de referencia, que contiene una referencia a los datos. Por lo tanto, pasar una
variable de tipo de valor a un método significa pasar una copia de la variable al método.
Cualquier cambio en el parámetro que se produzca dentro del método no afectará a los
datos originales almacenados en la variable.

El siguiente ejemplo muestra como trabajar pasando parámetros por valor:

class EjemploVal
{
static void Funcion3(int dato)
{
dato = 3;
}
static void Main()
{
int valor = 0; // Variable inicializada en 0
Funcion3(valor); // Variable pasada por valor
System.Console.WriteLine("El valor es: {0}", valor); // valor
sigue siendo 0
}
}

Como pueden observar, la variable valor es inicializada en cero. Cuando se invoca a la


Funcion3, el contenido de valor se copia en el parámetro dato, el cual se cambia dentro del
método. Sin embargo, en Main, el valor de la variable valor es el mismo, antes y después de
llamar al método Funcion3, es decir, el cambio que se produce dentro del método sólo
afecta a la variable local dato.

Tal vez en ocaciones al usar el out tengan los siguientes errores:

Error del compilador CS0269


"Uso del parámetro out sin asignar 'parámetro'"

Error del compilador CS0177


"Es necesario asignar el parámetro 'parámetro' out antes de que el control abandone el
método actual"

Bueno, esto se debe a que el compilador no pudo comprobar que al parámetro out se le
hubiera asignado a un valor antes de utilizarlo, es decir, no se asignó un valor a un
parámetro marcado con la palabra clave out en el cuerpo del método. Pero aquí se nos
crearía un problema si lo que deseamos es primero leer el valor antes de cambiarlo, por lo
tanto en estos casos no nos va a servir el uso de out, entonces la solución es utilizar un
parámetro ref en su lugar.

Si necesitan más información, visiten la fuente: http://msdn.microsoft.com

Espero les sea de ayuda.

Saludos, Toby

También podría gustarte