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

miércoles, 27 de enero de 2010

Cuando usar Int32.Parse vs Convert.ToInt32 en C#

Int32.Parse lo vamos a utilizar cuando estamos completamente seguros que el texto corresponde a un valor numerico, por ejemplo, si tengo que convertir un valor proveniente de una caja de texto a un entero y hemos limitado a que sólo se ingresen números, no vamos a tener problemas con Int32.Parse.

Pero si el valor proviene de una base de datos, puede darse el caso que el valor que recibamos sea nulo, con lo cual obtendríamos una excepción por lo tanto vamos a tener que hacer try{} catch{}, entonces para evitarnos este problema usamos Convert.ToInt32, que nos devolvera un cero cuando nuestro valor a convertir sea Null.

Saludos, Toby

viernes, 22 de enero de 2010

Usar IsPostBack en ASP.NET

IsPostBack nos entrega un valor que indica si la página se está cargando como respuesta a un valor devuelto por el cliente, o si es la primera vez que se obtiene acceso a ella.

La forma de usar en Visual Basic es la siguiente:

Sub Page_Load
    If Not IsPostBack
        
    End If
End Sub

Y para C# sería así:

private void Page_Load()
{
    if (!IsPostBack)
    {
        
    }
}

Ahora quizás te preguntes ¿y cuando será bueno usar el IsPostBack?

La respuesta es simple, toda vez que no sea necesario ejecutar un código producto de un PostBack (un reenvio de los datos del formulario de vuelta al servidor) el cual puede ser provocado por la accion de un evento click de un boton o el cambio de selección de un combobox.

Por ejemplo, cuando cargas una pagina web y llenas una lista con información que rescatas de una base de datos, no es necesario que consultes la base de datos todas las veces que se hace el PostBack, ya que basta solo con la primera carga.

Saludos, Toby.

Entradas populares