MAIN() Y ARGUMENTOS

El método Main es el punto de entrada del programa, donde crea objetos e invoca otros métodos. En un programa de C#, sólo puede haber un punto de entrada.

 

 

class TestClass

{

static void Main(string[] args)

{

// Display the number of command line arguments:

System.Console.WriteLine(args.Length);

}

}

 

Información general

  • El método Main es el punto de entrada del programa, donde se inicia y finaliza el control.
  • Se declara dentro de una clase o una estructura. Debe ser estático y no debería ser público. (En el ejemplo anterior, recibe el acceso predeterminado de privado.)
  • Puede tener un tipo de valor devuelto void o int.
  • El método Main se puede declarar con o sin parámetros.
  • Los parámetros se pueden leer como argumentos de la línea de comandos indizados basados en cero.
  • A diferencia de C y C++, el nombre del programa no se trata como el primer argumento de la línea de comandos.

 

En esta sección

  • Argumentos de línea de comandos (Guía de programación de C#)
  • Cómo: Mostrar argumentos de línea de comandos (Guía de programación de C#)
  • Cómo: Obtener acceso a argumentos de línea de comandos mediante Foreach (Guía de programación de C#)
  • Valores devueltos de Main() (Guía de programación de C#)

 

 

 

E LÍNEA DE COMANDOS

 

Se pueden utilizar argumentos en el método Main; si se utilizan, tendrá una de las formas siguientes:

 

static int Main(string[] args)

 

 

static void Main(string[] args)

 

El parámetro del método Main es una matriz de tipo String que representa los argumentos de la línea de comandos. Normalmente se utiliza la propiedad Length para comprobar si existen argumentos; por ejemplo:

 

 

if (args.Length == 0)

{

System.Console.WriteLine(“Please enter a numeric argument.”);

return 1;

}

 

También se pueden convertir los argumentos de tipo string en tipos numéricos mediante la clase Convert el método Parse. Por ejemplo, la instrucción siguiente convierte la cadena en un número long utilizando el método Parse en la clase Int64:

 

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

 

También se puede utilizar el tipo long de C#, que equivale a Int64:

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

Igualmente, es posible usar el método ToInt64 de la clase Convert para lograr el mismo objetivo:

long num = Convert.ToInt64(s); 

 

Para obtener más información, vea Parse y Convert.

 

Ejemplo

En este ejemplo, el programa toma un argumento en tiempo de ejecución, lo convierte en un número entero y calcula el factorial del número. Si no se proporciona ningún argumento, el programa emite un mensaje en el que se describe la forma de utilizarlo correctamente.

 

// arguments: 3 

 

 

public class Functions

{

public static long Factorial(int n)

{

if (n < 0) { return -1; } //error result – undefined

if (n > 256) { return -2; } //error result – input is too big

 

if (n == 0) { return 1; }

 

// Calculate the factorial iteratively rather than recursively:

 

long tempResult = 1;

for (int i = 1; i <= n; i++)

{

tempResult *= i;

}

return tempResult;

}

} 

 

 

 

class MainClass

{

static int Main(string[] args)

{

// Test if input arguments were supplied:

if (args.Length == 0)

{

System.Console.WriteLine(“Please enter a numeric argument.”);

System.Console.WriteLine(“Usage: Factorial <num>”);

return 1;

}

 

try

{

// Convert the input arguments to numbers:

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

 

System.Console.WriteLine(“The Factorial of {0} is {1}.”, num, Functions.Factorial(num));

return 0;

}

catch (System.FormatException)

{

System.Console.WriteLine(“Please enter a numeric argument.”);

System.Console.WriteLine(“Usage: Factorial <num>”);

return 1;

}

}

} 

 

Resultado

The Factorial of 3 is 6.

 

 

Comentarios

A continuación se muestran dos ejecuciones de ejemplo del programa en las que se supone que el nombre del programa es Factorial.exe.

 

Ejecución nº 1:

Escriba la siguiente línea de comandos:

Factorial 10

Obtiene el resultado siguiente:

The Factorial of 10 is 3628800.

 

Ejecución nº 2:

Escriba la siguiente línea de comandos:

Factorial

Obtiene el resultado siguiente:

Please enter a numeric argument.

Usage: Factorial <num>

2.2.- COMO MOSTRAR ARGUMENTOS DE LÍNEA DE COMANDOS

 

Los argumentos proporcionados a una aplicación ejecutable en la línea de comandos son accesibles a través de un parámetro opcional de Main. Los argumentos se proporcionan en forma de matriz de cadenas. Cada elemento de la matriz contiene un argumento. Se quita el espacio en blanco entre los argumentos. Por ejemplo, considere estas invocaciones de la línea de comandos de una aplicación ejecutable ficticia:

 

Entrada en la línea de comandos

Matriz de cadenas pasadas a Main  

executable.exe a b c

“a”

“b”

“c” 

executable.exe one two

“one”

“two” 

executable.exe “one two” three

“one two”

“three” 

 

Ejemplo

Este ejemplo muestra los argumentos de la línea de comandos pasados a una aplicación de línea de comandos. El resultado mostrado es para la primera entrada de la tabla anterior.

 

class CommandLine

{

static void Main(string[] args)

{

// The Length property provides the number of array elements

System.Console.WriteLine(“parameter count = {0}”, args.Length);

 

for (int i = 0; i < args.Length; i++)

{

System.Console.WriteLine(“Arg[{0}] = [{1}]”, i, args[i]);

}

}

} 

 

Resultados

parameter count = 3

Arg[0] = [a]

Arg[1] = [b]

Arg[2] = [c] 

 

 

 

 

 

Otro enfoque para recorrer en iteración la matriz es utilizar la instrucción foreach como se muestra en este ejemplo. La instrucción foreach se puede utilizar para recorrer en iteración una matriz, una clase de colección de .NET Framework o cualquier clase o estructura que implemente la interfaz IEnumerable.

 

Ejemplo

En este ejemplo se muestra cómo imprimir los argumentos de la línea de comandos con foreach.

 

// arguments: John Paul Mary 

 

 

class CommandLine2

{

static void Main(string[] args)

{

System.Console.WriteLine(“Number of command line parameters = {0}”, args.Length);

 

foreach (string s in args)

{

System.Console.WriteLine(s);

}

}

} 

 

Resultados

Number of command line parameters = 3

John

Paul

Mary 

 

 

 

 

    

2.4.- VALORES DEVUELTOS DE MAIN()

 

El método Main puede ser de tipo void:

 

 

static void Main()

{

//…

}

 

También puede devolver un valor de tipo int:

 

 

static int Main()

{

//…

return 0;

}

 

Si no se va a utilizar el valor que devuelve el método Main, entonces devolver void permite crear un código un poco más simple. Sin embargo, devolver un entero permite que el programa relacione información de estado con otros programas o secuencias de comandos que invocan al ejecutable. En el ejemplo siguiente se muestra cómo utilizar el valor que devuelve Main.

 

Ejemplo

En este ejemplo, se utiliza un archivo de proceso por lotes para ejecutar un programa y probar el valor que devuelve la función Main. Cuando un programa se ejecuta en Windows, cualquier valor que devuelva la función Main se almacena en una variable de entorno denominada ERRORLEVEL. Al inspeccionar la variable ERRORLEVEL, los archivos de proceso por lotes pueden determinar en consecuencia el resultado de la ejecución. Tradicionalmente, un valor devuelto de cero indica una ejecución correcta. El programa que se muestra a continuación es un programa muy simple que devuelve un valor de cero desde la función Main.

 

class MainReturnValTest

{

static int Main()

{

//…

return 0;

}

} 

 

Dado que este ejemplo utiliza un archivo de proceso por lotes, es mejor compilar el código desde la línea de comandos, como se muestra en Cómo: Generar desde la línea de comandos.

Luego, se utiliza un archivo de proceso por lotes para invocar al ejecutable que resulta del ejemplo de código anterior. Puesto que el código devuelve un valor de cero, el archivo de proceso por lotes creará un informe de operación correcta, pero si el código anterior se cambia para que devuelva un valor distinto de cero y luego se vuelve a compilar, la ejecución posterior del archivo de proceso por lotes indicará un error.

 

rem test.bat

@echo off

MainReturnValueTest

@if “%ERRORLEVEL%” == “0” goto good

 

:fail

echo Execution Failed

echo return value = %ERRORLEVEL%

goto end

 

:good

echo Execution Succeded

echo return value = %ERRORLEVEL%

goto end

 

:end 

 

Resultados del ejemplo

Execution Succeded

return value = 0