miércoles, 24 de febrero de 2010

Pasar parámetros Reference-Type

Una variable de un tipo de referencia no contiene directamente sus datos; contiene una referencia a ellos. Cuando se pasa un parámetro de tipo de referencia por valor, es posible cambiar los datos a los que apunta la referencia, como el valor de un miembro de clase. Sin embargo, no se puede cambiar el valor de la propia referencia; es decir, no se puede utilizar la misma referencia para asignar memoria a una nueva clase y hacer que persista fuera del bloque. Para hacer esto, se debe pasar el parámetro mediante la palabra clave ref u out. Para simplificar, los siguientes ejemplos utilizan ref.

Ejemplo 1: pasar tipos de referencia por valor
El siguiente ejemplo ilustra el paso de un parámetro de tipo de referencia, arr, por valor, a un método, Change. Como el parámetro es una referencia a arr, es posible cambiar los valores de los elementos de la matriz. Sin embargo, el intento de volver a asignar el parámetro a otra ubicación de memoria sólo funciona dentro del método y no afecta a la variable original, arr.

class PassingRefByVal
{
static void Change(int[] pArray)
{
pArray[0] = 888; // Esto afecta el elmento original.
pArray = new int[5] {-3, -1, -2, -3, -4}; // Este cambio es local.
System.Console.WriteLine("Dentro del metodo,
el primer elemento es: {0}", pArray[0]);
}

static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Dentro del Main, antes de llamar el metodo, el primer elemento es: {0}", arr [0]);

Change(arr);
System.Console.WriteLine("Dentro del Main, despues de llamar el metodo, el primer elmento es: {0}", arr [0]);
}
}
Resultados
Dentro del Main, antes de llamar el metodo, el primer elemento es: 1

Dentro del metodo, el primer elemento es: -3

Dentro del Main, despues de llamar el metodo, el primer elemento es: 888


Descripción del código
En el ejemplo anterior, la matriz arr, que es un tipo de referencia, se pasa al método sin el parámetro ref. En ese caso, lo que se pasa al método es una copia de la referencia, la cual apunta a arr. El resultado muestra cómo el método puede cambiar el contenido de un elemento de la matriz, en este caso de 1 a 888. Sin embargo, cuando se asigna una nueva porción de memoria mediante el operador new dentro del método Change, la variable pArray hace referencia a una nueva matriz. De este modo, cualquier cambio posterior no afectará a la matriz original, arr, que se crea dentro de Main. De hecho, en este ejemplo se crean dos matrices, una dentro de Main y otra dentro del método Change.

Ejemplo 1: pasar tipos de referencia por referencia
Este ejemplo es el mismo que el ejemplo anterior, excepto que utiliza la palabra clave ref en el encabezado del método y en la llamada. Cualquier cambio que se realice en el método afectará a las variables originales del programa que hace la llamada.

class PassingRefByRef
{
static void Change(ref int[] pArray)
{
// Los dos siguientes cambios afectaran las variables originales:
pArray[0] = 888;
pArray = new int[5] {-3, -1, -2, -3, -4};
System.Console.WriteLine("Dentro del metodo, el primer elemento es: {0}", pArray[0]);
}

static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Dentro del Mail, antes de llamar el metodo, el primer elemento es: {0}", arr[0]);

Change(ref arr);
System.Console.WriteLine("Dentro del Main, desdpues de llamar el metodo, el primer elemento es: {0}", arr[0]);
}
}
Resultados
Dentro del Main, antes de llamar el metodo, el primer elemento es: 1

Dentro del metodo, el primer elemento es: -3

Dentro del Main, despues de llamar el metodo, el primer elemento es: -3

Descripción del código
Todos los cambios que tienen lugar dentro del método afectan a la matriz original en Main. De hecho, la matriz original se reasigna mediante el operador new. De esta forma, después de llamar al método Change, cualquier referencia a arr apunta a la matriz de cinco elementos que se crea en el método Change.

Ejemplo: intercambiar dos cadenas
El intercambio de cadenas constituye un buen ejemplo de paso de parámetros de tipo de referencia por referencia. En el ejemplo, se inicializan dos cadenas, str1 y str2, en Main y se pasan al método SwapStrings como parámetros modificados por la palabra clave ref. Las dos cadenas se intercambian dentro del método y también dentro de Main.

class SwappingStrings
{
static void SwapStrings(ref string s1, ref string s2)
// El parametro string es pasado por referencia.
// Ningun cambio sobre los parametros afectaran las variables originales.

{
string temp = s1;
s1 = s2;
s2 = temp;
System.Console.WriteLine("Dentro del metodo: {0} {1}", s1, s2);
}

static void Main()
{
string str1 = "John";
string str2 = "Nunez";
System.Console.WriteLine("Dentro de Main, antes del intercambio: {0} {1}", str1, str2);

SwapStrings(ref str1, ref str2); //Pasando el string por referencia
System.Console.WriteLine("Dentro del Main, despues del intercambio: {0} {1}", str1, str2);
}
}
Resultados
Dentro del Main, antes del intercambio: John Nunez

Dentro del metodo: Nunez John

Dentro del Main, despues del intercambio: Nunez John


Descripción del código
En este ejemplo, los parámetros se deben pasar por referencia para que afecten a las variables del programa que realiza la llamada. Si se elimina la palabra clave ref del encabezado del método y de la llamada al método, no se producirá ningún cambio en el programa que realiza la llamada.

1 comentario:

  1. Cuando una variable se pasa a una metodo, se crea una copia de la variable sobre la cual se realizaran las operaciones y la vida util de estas copias concluye al finalizar la metodo. Sin embargo, para las variables pasadas por referencia no se generan copias y se opera sobre ellas directamente.

    ResponderBorrar

Preguntas;Comentarios;Aportes;Criticas Positivas;Recomendaciones.