Pasar parámetros de tipo de valor (Guía de programación de C#)

Actualización: noviembre 2007

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

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)
    // The parameter x is passed by value.
    // Changes to x will not affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(n);  // Passing the variable by value.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 5
*/

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.

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)
    // The parameter x is passed by reference.
    // Changes to x will affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(ref n);  // Passing the variable by reference.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 25
*/

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.

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);

    // Keep the console window open in debug mode.
    System.Console.WriteLine("Press any key to exit.");
    System.Console.ReadKey();
}
/* Output:
    i = 2  j = 3
    i = 3  j = 2
*/

Vea también

Conceptos

Guía de programación de C#

Referencia

Pasar parámetros (Guía de programación de C#)

Pasar parámetros Reference-Type (Guía de programación de C#)