Main () y otros métodos (C# y Java)

Actualización: noviembre 2007

En esta sección se analizan algunos métodos y la forma en que los parámetros del método se pasan por referencia y por valor.

El método Main ()

Cada aplicación de C# debe contener un método Main único, que especifique dónde debe comenzar la ejecución del programa. En C#, Main se pone en mayúsculas, mientras que Java utiliza main en minúscula.

Main puede devolver sólo int o void y tiene un argumento de matriz de cadena opcional para representar parámetros de línea de comandos:

static int Main(string[] args)
{
    //...
    return 0;
}

El parámetro de matriz de cadena, que contiene todos los argumentos de la línea de comandos pasados, funciona igual que en Java. Así, args[0] especifica el primer parámetro de línea de comandos, args[1] denota el segundo parámetro, etc. A diferencia de C++, la matriz args no contiene el nombre del archivo EXE.

Otros métodos

Cuando se pasan parámetros a un método, se pueden pasar por valor o por referencia. Los parámetros de valor simplemente toman el valor de cualquier variable para utilizarlo en el método. Por lo tanto, el valor de variable en el código de llamada no se ve afectado por las acciones realizadas en los parámetros de un método.

Sin embargo, los parámetros de referencia apuntan a una variable declarada en el código de llamada; por lo tanto, los métodos modificarán el contenido de esa variable cuando se pase por referencia.

Pasar por referencia

En Java y C#, los parámetros de método que hacen referencia a un objeto siempre se pasan por referencia, mientras que los parámetros de tipo de datos primitivo (tipos de valor en C#) se pasan por valor.

En C#, para pasar un tipo de valor por referencia, debe especificar una de las palabras clave ref o out. La diferencia entre estas dos palabras clave radica en la inicialización de los parámetros. Un parámetro ref se debe inicializar antes de su utilización, mientras que un parámetro out no debe inicializarse explícitamente sin que antes se haya pasado por referencia y se haya omitido cualquier valor anterior.

La palabra clave ref

Especifique esta palabra clave en un parámetro de tipo de valor cuando desee que el método llamado cambie permanentemente el valor de las variables utilizadas como parámetros. De esta manera, en lugar de pasar el valor de una variable utilizada en la llamada, se pasa una referencia a la propia variable. Entonces el método funciona en la referencia, de modo que los cambios realizados al parámetro durante la ejecución del método se conservan en la variable original utilizada como parámetro para el método.

El código siguiente muestra un ejemplo de esto en el método Add, donde el segundo parámetro int se pasa por referencia con la palabra clave ref:

class TestRef
{
    private static void Add(int i, ref int result)
    {
        result += i;
        return;
    }

    static void Main()
    {
        int total = 20;
        System.Console.WriteLine("Original value of 'total': {0}", total);

        Add(10, ref total);
        System.Console.WriteLine("Value after calling Add(): {0}", total);
    }
}

El resultado de este sencillo ejemplo demuestra que los cambios realizados al parámetro resultante se reflejan en la variable total, utilizada en la llamada al método Add :

Original value of 'total': 20

Value after calling Add(): 30

Esto se debe a que el parámetro resultante hace referencia a la ubicación de memoria real que ocupa la variable total en el código de llamada. Una propiedad de una clase no es una variable; por lo tanto, no se puede utilizar directamente como parámetro ref.

La palabra clave ref debe preceder al parámetro cuando se llama al método, al igual que en la declaración de método.

La palabra clave out

La palabra clave out tiene un efecto muy similar a la palabra clave ref. Las modificaciones realizadas a un parámetro declarado que utiliza out serán visibles fuera del método. Las dos diferencias con respecto a ref son que todo valor inicial de un parámetro out se omite dentro del método y que un parámetro out se debe asignar durante la ejecución del método:

class TestOut
{
    private static void Add(int i, int j, out int result)
    {
        // The following line would cause a compile error:
        // System.Console.WriteLine("Initial value inside method: {0}", result);

        result = i + j;
        return;
    }

    static void Main()
    {
        int total = 20;
        System.Console.WriteLine("Original value of 'total': {0}", total);

        Add(33, 77, out total);
        System.Console.WriteLine("Value after calling Add(): {0}", total);
    }
}

En este caso, el tercer parámetro para el método Add se declara con la palabra clave out y las llamadas al método también necesitan la palabra clave out para ese parámetro. El resultado será:

Original value of 'total': 20

Value after calling Add(): 110

Por lo tanto, en resumen, utilice la palabra clave ref cuando desee que un método modifique una variable existente y utilice la palabra clave out, para devolver un valor generado dentro del método. Generalmente, esto se utiliza junto con el valor que el método devuelve cuando éste genera más de un valor resultante para el código de llamada.

Vea también

Conceptos

Guía de programación de C#

Main() y argumentos de línea de comandos (Guía de programación de C#)

Referencia

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

Otros recursos

Lenguaje de programación C# para desarrolladores de Java