miércoles, 24 de febrero de 2010

Pasar parámetros de tipo de 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. Si se desea que el método llamado pueda cambiar el valor del parámetro, deberá pasarlo por referencia, utilizando la palabra clave ref uout. Para simplificar, los siguientes ejemplos utilizan ref.

Ejemplo 1: pasar tipos de valor por valor
El siguiente ejemplo ilustra el paso de parámetros de tipo de valor por valor. La variable n se pasa por valor al método SquareIt. Cualquier cambio que se produzca dentro del método no afectará al valor original de la variable.

class PassingValByVal
{
static void SquareIt(int x)
// El parametro x es pasado por valor.
// Los cambios a x no afectaran el valor original de x.
{
x *= x;
System.Console.WriteLine("El valor dentro del metodo: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("El valor antes de llamar al metodo: {0}", n);

SquareIt(n); // Pasando la variable por valor.
System.Console.WriteLine("El valor despues de llamar el metodo: {0}", n);
}
}
Resultados
The value before calling the method: 5

The value inside the method: 25

The value after calling the method: 5

Descripción del código
La variable n, que es un tipo de valor, contiene su dato, el valor 5. Cuando se invoca SquareIt, el contenido de n se copia en el parámetro x, el cual se eleva al cuadrado dentro del método. Sin embargo, en Main, el valor de n es el mismo, antes y después de llamar al método SquareIt. De hecho, el cambio que se produce dentro del método sólo afecta a la variable local x.

Ejemplo 1: pasar tipos de valor por referencia
El siguiente ejemplo es igual que el ejemplo anterior, excepto que el parámetro se pasa mediante la palabra clave ref. El valor del parámetro cambia después de llamar al método.

class PassingValByRef
{
static void SquareIt(ref int x)
// El parametro x es pasado por referencia.
// Los cambios a x afectaran el valor original de x.

{
x *= x;
System.Console.WriteLine("El valor dentro del metodo: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("El valor antes de llamar el metodo: {0}", n);

SquareIt(ref n); // Pasando la variable por referencia.
System.Console.WriteLine("El valor despues de llamar el metodo: {0}", n);
}
}
Resultados
The value before calling the method: 5

The value inside the method: 25

The value after calling the method: 25

Descripción del código
En este ejemplo, no se pasa el valor de n, sino una referencia a n. El parámetro x no es de tipo int; es una referencia a un valor de tipo int, en este caso, una referencia a n. Por lo tanto, cuando x se eleva al cuadrado dentro del método, lo que realmente se eleva al cuadrado es la variable a la que x hace referencia, es decir, n.

Ejemplo 3: intercambiar tipos de valor
Un ejemplo habitual de cambio de valores de los parámetros pasados es el método Swap, en el que se pasan dos variables, x e y, y el método intercambia su contenido. Los parámetros se deben pasar al método Swap por referencia; de otro modo, se estarán utilizando copias locales de los parámetros dentro del método. El siguiente es un ejemplo del método Swap que utiliza parámetros por referencia:

static void SwapByRef(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
Cuando se invoca este método, se debe utilizar la palabra clave ref en la llamada, como se muestra a continuación:

static void Main()
{
int i = 2, j = 3;
System.Console.WriteLine("i = {0} j = {1}" , i, j);

SwapByRef (ref i, ref j);

System.Console.WriteLine("i = {0} j = {1}" , i, j);
}
Resultados
i = 2 j = 3

i = 3 j = 2

No hay comentarios.:

Publicar un comentario

Preguntas;Comentarios;Aportes;Criticas Positivas;Recomendaciones.