sábado, 30 de enero de 2010

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

No hay comentarios:

Publicar un comentario

Entradas populares