2010-03-02 15 views
12

Non capisco perché la funzione Main del C# sia vuota per impostazione predefinita (in un progetto di console, per esempio). In C e C++ lo standard dice chiaramente che main deve restituire int, e l'utilizzo di un valore di ritorno ha senso perché possiamo controllare quel valore di ritorno da un programma esterno e vedere se l'applicazione C/C++ è terminata correttamente o ha riscontrato un errore.Perché C# usa il vuoto implicito Main?

Quindi le mie domande sono:

  1. Perché Visual Studio dichiara Main come vuoto?
  2. Qual è il modo migliore per restituire un valore al sistema operativo una volta terminata l'esecuzione di un'applicazione console C#?

risposta

11

In C#, è possibile utilizzare, see MSDN:

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

Questa flessibilità (confusione) esiste anche in C++ ed è ereditato da C.

È anche possibile restituire un valore (int) in 2 modi.

In un'applicazione console userei int Main() { ...; return 2; }

In un WinForms/WPF/... app, nella situazione rara ha bisogno di un valore di ritorno, vorrei utilizzare
Environment.ExitCode = 1; o Environment.Exit(1);

+1

C'è sicuramente confusione in C e C++, in particolare nei vecchi libri di testo, ma gli standard ISO di C e C++ richiedono solo 'int main (void)' e 'int main (int, char **)'. 'void main (void)' non è mai stato standard e dovrebbe essere evitato. –

+2

Il rispondente sembra riferirsi a ciò che si può fare, non allo standard. – marr75

16

È possibile utilizzare uno int o vuoto come un tipo di ritorno. Quindi, basta cambiarlo e restituire un valore come in C++.

Forse è vuoto per impostazione predefinita al fine di non imbarazzare i principianti.

+4

È vuoto per impostazione predefinita perché di solito non è necessario restituire nulla da Main() in un'app di vincita (il codice di ritorno è legacy da dos) –

3

È possibile modificare il tipo di ritorno di Principale senza causare problemi.

+2

Puoi cambiarlo in qualcosa che ti piace? O sono 'int' e' void' le uniche opzioni? –

+0

Beh, lo stesso si può dire su C e C++ in alcune situazioni (ad un certo punto, 'void main' è stato considerato valido da alcuni compilatori). Esiste un modo standard per dichiarare Main in C#? – IVlad

6

Le ragioni per cui gli sviluppatori di C# hanno deciso di dichiarare il Main come nullo non ho potuto dire. Per quanto riguarda la restituzione di valori al sistema operativo quando l'applicazione è terminata è possibile utilizzare questo:

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

È possibile utilizzare Environment.Exit() per terminare e restituire un codice intero al sistema operativo. In alternativa, è possibile impostare Environment.ExitCode e tale codice verrà restituito al sistema operativo ogni volta che il programma termina normalmente.

+0

È considerata una pratica migliore rispetto alla semplice dichiarazione di Main int e di restituzione di un valore? Suppongo che lo sia, perché in questo modo possiamo uscire dal programma con un exitcode da qualsiasi altra funzione. – IVlad

+0

@IVlad - Non direi che è una pratica migliore in realtà, solo un modo diverso di farlo. –

2

Il modo migliore per restituire un valore di uscita è quello di utilizzare. Dico questo perché i codici di uscita diversi da zero vengono solitamente utilizzati per indicare alcuni errori, in genere uno da cui non si desidera continuare. Chiamando Exit con un valore di uscita diverso da zero entrambi segnalano l'errore attraverso il valore ed esce dal programma.

Environment.Exit(value); 

EDIT: Nota, il contesto per la mia dichiarazione era all'interno Main per un programma di console. Le librerie e altri metodi dovrebbero generare eccezioni o restituire valori di errore. Solo la tua routine principale dovrebbe chiamare Exit. Scusa se questo non era chiaro.

+1

-1: Chiamare 'Environment.Exit()' è il peggior tipo di istruzione 'goto' - da qualsiasi parte del programma, attraverso tutti i confini fino alla terminazione. –

+0

Ti manca il punto: Environment.Exit() è l'ABEND di .NET. Si chiama esattamente quando si vuole uscire dal programma in modo anomalo, con un valore di uscita diverso da zero, proprio perché continuare oltre quel punto sarebbe pericoloso (o inutile). È molto simile a un ritorno anticipato da una funzione. Non riesco a pensare a nessuna situazione in cui lo utilizzerei che sarebbe meglio servire creando una logica fasulla per arrivare alla "fine" del programma. Detto questo, lo userei solo in 'Main' - non vuoi che le tue librerie lo chiamino, dovrebbero lanciare delle eccezioni. – tvanfosson

2

Ricorda che c'è ancora un'altra "scatola" attorno al tuo programma: il CLR. Restituirà i codici di errore, quando il codice genera un'eccezione non gestita.

7

Non è implicitamente annullato. Come in, non puoi semplicemente dichiarare main (String [] args) e farlo compilare come una funzione void. I progetti predefiniti dichiarano main() come nullo perché i progetti di default non hanno nulla di utile da restituire dal main.

Vale anche la pena notare che C# non è C o C++. Alcune delle sintassi sono le stesse, ma le differenze sono molto più vaste.

Problemi correlati