2010-03-02 11 views
12

No entiendo por qué la función Main de C# es nula por defecto (en un proyecto de consola, por ejemplo). En C y C++, el estándar dice claramente que main debe devolver int, y usar un valor de retorno tiene sentido porque podemos verificar ese valor de retorno desde un programa externo y ver si la aplicación C/C++ finalizó correctamente o encontró un error.¿Por qué C# usa el vacío implícito Principal?

Así que mis preguntas son:

  1. ¿Por qué declaran Visual Studio Main tan vacío?
  2. ¿Cuál es la mejor forma de devolver un valor al sistema operativo una vez que la aplicación de la consola C# ha terminado de ejecutarse?

Respuesta

11

En C#, puede utilizar, see MSDN:

static int Main() 
static int Main(string[] args) 
static void Main() 
static void Main(string[] args) 

Esta flexibilidad (confusión) también existe en C++ y se hereda de C.

También puede devolver un valor (int) de 2 maneras.

En una aplicación de consola que yo usaría int Main() { ...; return 2; }

En un WinForms/WPF/... aplicación, en la situación poco frecuente que necesita un valor de retorno, me gustaría utilizar
Environment.ExitCode = 1; o Environment.Exit(1);

+1

Ciertamente hay confusión en C y C++, particularmente en los libros de texto antiguos, pero los estándares ISO de C y C++ solo requieren 'int main (void)' y 'int main (int, char **)'. 'void main (void)' nunca ha sido estándar y debe evitarse. –

+2

El que responde parece referirse a lo que puede hacer, no al estándar. – marr75

16

Puede utilizar cualquiera int o nula como un tipo de retorno. Por lo tanto, simplemente cámbialo y devuelve un valor como en C++.

Quizás es nulo por defecto para no confundir a los principiantes.

+4

Es nulo por defecto porque normalmente no necesita devolver nada de Main() en una aplicación win (ese código de retorno es heredado de dos) –

3

Puede cambiar el tipo de retorno de Principal sin causar ningún problema.

+2

¿Se puede cambiar a lo que quiera? ¿O son 'int' y' void' las únicas opciones? –

+0

Bueno, lo mismo puede decirse de C y C++ en algunas situaciones (en algún momento, 'void main' fue considerado válido por algunos compiladores). ¿Hay una forma estándar de declarar Main en C#? – IVlad

6

Las razones detrás de por qué los desarrolladores de C# decidieron declarar Main como nulo no pude decir. En cuanto a la devolución de valores en el sistema operativo cuando se termine la aplicación puede utilizar este:

System.Environment.ExitCode = 1; // Or whatever number other than 0 for errors. 
0

Usted puede usar Environment.Exit() para terminar y devolver un código entero al sistema operativo. Alternativamente, puede configurar Environment.ExitCode y ese código se devolverá al sistema operativo siempre que su programa termine normalmente.

+0

¿Se considera esto una práctica mejor que simplemente declarar Main como int y devolver un valor? Supongo que sí, porque de esta forma podemos salir del programa con un código de salida de cualquier otra función. – IVlad

+0

@IVlad - No diría que es una mejor práctica realmente, solo una manera diferente de hacerlo. –

2

La mejor forma de devolver un valor de salida es usar. Digo esto porque los códigos de salida distintos de cero generalmente se usan para indicar algún error, generalmente uno del que no querría continuar. Llamar al Exit con un valor de salida distinto de cero indica el error a través del valor y sale del programa.

Environment.Exit(value); 

EDITAR: Nota, el contexto para mi estado de cuenta estaba dentro de Main para un programa de consola. Las bibliotecas y otros métodos deben arrojar excepciones o devolver valores de error. Solo su rutina principal debe llamar al Exit. Lo siento si esto no estaba claro.

+1

-1: Llamar a 'Environment.Exit()' es el peor tipo de instrucción 'goto', desde cualquier punto del programa, cruzando todos los límites hasta la terminación. –

+0

Olvida el punto - Environment.Exit() es el ABEND de .NET. Usted lo llama exactamente cuando quiere salir del programa de forma anormal, con un valor de salida distinto de cero, precisamente porque continuar más allá de ese punto sería peligroso (o inútil). Es muy parecido a un regreso temprano de una función. No puedo pensar en ninguna situación en la que lo use que sería mejor si creara una lógica falsa para llegar al "final" del programa. Dicho esto, solo lo usaría en 'Main'; no quieres que tus bibliotecas lo llamen, deberían lanzar excepciones. – tvanfosson

2

Recuerde que todavía hay otra "caja" alrededor de su programa: la CLR. Devolverá códigos de error cuando su código arroje una excepción no controlada.

7

No está implícitamente vacío. Como en, no puedes simplemente declarar main (String [] args) y hacer que se compile como una función vacía. Los proyectos predeterminados declaran main() como void porque los proyectos predeterminados no tienen nada útil para devolver desde main.

También vale la pena señalar que C# no es C o C++. Parte de la sintaxis es la misma, pero las diferencias son mucho más amplias.

Cuestiones relacionadas