Compartir a través de


Main() y argumentos de línea de comandos

Sugerencia

¿No está familiarizado con el desarrollo de software? Comience primero con los tutoriales de introducción . Estos tutoriales usan instrucciones de nivel superior, lo que es más sencillo para las nuevas aplicaciones.

¿Trabaja con un código base existente? Muchas aplicaciones existentes usan un método explícito Main . En este artículo se explica cómo funciona y cómo usarlo de forma eficaz.

Al iniciar una aplicación de C#, el entorno de ejecución llama al método Main. El método Main es el punto de entrada de una aplicación de C#

Un programa de C# solo puede tener un punto de entrada. Si tiene más de una clase con un Main método, debe usar la opción del compilador StartupObject al compilar el programa para especificar qué Main método actúa como punto de entrada. Para obtener más información, consulte StartupObject (opciones del compilador de C#). En el ejemplo siguiente se muestra el número de argumentos de la línea de comandos como primera acción:

class TestClass
{
    static void Main(string[] args)
    {
        Console.WriteLine(args.Length);
    }
}

Información general

El Main método es el punto de entrada de un programa ejecutable. Cuando se inicia el programa, el entorno de ejecución llama a Main antes de ejecutar cualquier otro código. Cuando Main se devuelve, finaliza el programa. Tú declaras Main siguiendo estas reglas:

  • Debe declarar Main dentro de una clase o estructura. La class envolvente puede ser static.
  • Main debe ser static.
  • Main puede tener cualquier modificador de acceso.
  • Main puede devolver void, int, Tasko Task<int>.
  • Si y solo si Main devuelve un Task o un Task<int>, la declaración de Main puede incluir el modificador async. Esta regla excluye específicamente un async void Main método .
  • Puede declarar el Main método con o sin un string[] parámetro que contenga argumentos de línea de comandos. Cuando se usa Visual Studio para crear aplicaciones de Windows, puede agregar el parámetro manualmente o usar el GetCommandLineArgs() método para obtener los argumentos de la línea de comandos. Los parámetros son argumentos de línea de comandos sin indexación. A diferencia de C y C++, el nombre del programa no se trata como el primer argumento de línea de comandos de la args matriz, pero es el primer elemento del GetCommandLineArgs() método.

Las siguientes permutaciones de declaraciones de Main se muestran en la lista:

static void Main() { }
static int Main() { }
static void Main(string[] args) { }
static int Main(string[] args) { }
static async Task Main() { }
static async Task<int> Main() { }
static async Task Main(string[] args) { }
static async Task<int> Main(string[] args) { }

Los ejemplos anteriores no especifican un modificador de acceso, por lo que son implícitamente private de forma predeterminada. Puede especificar cualquier modificador de acceso explícito.

En la tabla siguiente se resumen todas las firmas válidas Main y cuándo usar cada una de ellas:

Declaración Main Utiliza args contiene await Devuelve el código de salida.
static void Main() No No No
static int Main() No No
static void Main(string[] args) No No
static int Main(string[] args) No
static async Task Main() No No
static async Task<int> Main() No
static async Task Main(string[] args) No
static async Task<int> Main(string[] args)

Elija la firma más sencilla que se adapte a sus necesidades. Si no necesita argumentos de línea de comandos, omita el string[] args parámetro . Si no necesita devolver un código de salida, use void o Task. Si necesita llamar a métodos asincrónicos, use async con un tipo de valor devuelto Task o Task<int>.

Valores devueltos por Main()

Cuando devuelve int o Task<int>, el programa puede enviar información de estado a otros programas o scripts que ejecutan el ejecutable. Un valor devuelto de 0 normalmente significa correcto y un valor distinto de cero significa que hay un error.

En el ejemplo siguiente se devuelve un código de salida:

class MainReturnValTest
{
    static int Main()
    {
        //...
        return 0;
    }
}

Después de ejecutar el programa, puede comprobar el código de salida. En PowerShell, use $LastExitCode. En un archivo por lotes o script de shell, use %ERRORLEVEL%.

Si el Main método usa await, declárelo como async con un Task o Task<int> tipo de retorno. El tiempo de ejecución llama Main y espera a que se devuelva Task antes de que finalice el proceso. El tipo de valor devuelto no puede ser void o int porque el modificador async requiere un tipo de valor devuelto que el entorno de ejecución pueda esperar; void y int no representan trabajos en curso, por lo que el proceso podría finalizar antes de que se completen las operaciones asincrónicas. Use Task cuando no necesite un código de salida o Task<int> cuando haga lo siguiente:

class Program
{
    static async Task<int> Main(string[] args)
    {
        return await AsyncConsoleWork();
    }

    private static async Task<int> AsyncConsoleWork()
    {
        return 0;
    }
}

Argumentos de la línea de comandos

Incluya un string[] args parámetro en la Main declaración para aceptar argumentos de línea de comandos. Si no los necesita, omita el parámetro . El args parámetro es una String matriz que nunca es null; si no se proporciona ningún argumento, su Length valor es cero.

Puede convertir argumentos de cadena a otros tipos mediante Parse o Convert:

long num = long.Parse(args[0]);

Sugerencia

El análisis de argumentos de línea de comandos puede ser complejo. Considere la posibilidad de usar la biblioteca System.CommandLine para simplificar el proceso.

Para obtener un ejemplo de trabajo, vea Cómo mostrar argumentos de línea de comandos.

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.