Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Suggerimento
Novità dello sviluppo di software? Iniziare prima con le esercitazioni introduttive . Queste istruzioni nei tutorial utilizzano le istruzioni di primo livello, che sono più semplici per le nuove app.
Uso di una codebase esistente? Molte applicazioni esistenti usano un metodo esplicito Main . Questo articolo illustra come funziona e come usarlo in modo efficace.
Quando si avvia un'applicazione C#, il runtime chiama il Main metodo . Il metodo Main è il punto di ingresso di un'applicazione C#.
Un programma C# può avere un solo punto di ingresso. Se sono presenti più classi con un Main metodo, è necessario usare l'opzione del compilatore StartupObject quando si compila il programma per specificare quale Main metodo funge da punto di ingresso. Per altre informazioni, vedere StartupObject (opzioni del compilatore C#). Nell'esempio seguente viene visualizzato il numero di argomenti della riga di comando come prima azione:
class TestClass
{
static void Main(string[] args)
{
Console.WriteLine(args.Length);
}
}
Panoramica
Il Main metodo è il punto di ingresso di un programma eseguibile. All'avvio del programma, il runtime chiama Main prima dell'esecuzione di qualsiasi altro codice. Quando Main torna, il programma termina. Tu dichiari Main con queste regole:
- È necessario dichiarare
Mainall'interno di una classe o di uno struct. L'elementoclasscontenitore può esserestatic. - Il parametro
Maindeve essere impostato sustatic. -
Mainpuò avere qualsiasi modificatore di accesso. -
Mainpuò restituirevoid,int,TaskoTask<int>. - Se e solo se
Mainrestituisce unTasko unTask<int>, la dichiarazione diMainpuò includere il modificatoreasync. Questa regola esclude in modo specifico unasync void Mainmetodo. - È possibile dichiarare il
Mainmetodo con o senza unstring[]parametro che contiene argomenti della riga di comando. Quando si usa Visual Studio per creare applicazioni Windows, è possibile aggiungere il parametro manualmente oppure usare il GetCommandLineArgs() metodo per ottenere gli argomenti della riga di comando. I parametri sono argomenti della riga di comando con indice zero. A differenza di C e C++, il nome del programma non viene considerato come il primo argomento della riga di comando nellaargsmatrice, ma è il primo elemento del GetCommandLineArgs() metodo.
L'elenco seguente mostra le permutazioni delle Main dichiarazioni:
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) { }
Gli esempi precedenti non specificano un modificatore di accesso, quindi sono private in modo implicito per impostazione predefinita. È possibile specificare qualsiasi modificatore di accesso esplicito.
La tabella seguente riepiloga tutte le firme valide Main e quando usarle:
Dichiarazione di Main |
Utilizzazioni args |
Contiene await |
Restituisce il codice di uscita |
|---|---|---|---|
static void Main() |
No | No | No |
static int Main() |
No | No | Sì |
static void Main(string[] args) |
Sì | No | No |
static int Main(string[] args) |
Sì | No | Sì |
static async Task Main() |
No | Sì | No |
static async Task<int> Main() |
No | Sì | Sì |
static async Task Main(string[] args) |
Sì | Sì | No |
static async Task<int> Main(string[] args) |
Sì | Sì | Sì |
Scegli la firma più semplice adatta alle tue esigenze. Se non sono necessari argomenti della riga di comando, omettere il string[] args parametro . Se non è necessario restituire un codice di uscita, usare void o Task. Se è necessario chiamare metodi asincroni, usare async con un tipo di ritorno Task o Task<int>.
Valori restituiti da Main()
Quando si restituisce int o Task<int>, il programma può inviare informazioni sullo stato ad altri programmi o script che eseguono il file eseguibile. Un valore restituito di 0 solito indica l'esito positivo e un valore diverso da zero indica che si verifica un errore.
L'esempio seguente restituisce un codice di uscita:
class MainReturnValTest
{
static int Main()
{
//...
return 0;
}
}
Dopo aver eseguito il programma, è possibile controllare il codice di uscita. In PowerShell usare $LastExitCode. In un file batch o in uno script della shell usare %ERRORLEVEL%.
Se il Main e attende il completamento dell'oggetto restituito Task prima dell'uscita del processo. Il tipo restituito non può essere void o int perché il modificatore async richiede un tipo di ritorno che il runtime possa attendere — poiché void e int non rappresentano lavori in corso, il processo potrebbe terminare prima che le operazioni asincrone siano completate. Usare Task quando non è necessario un codice di uscita o Task<int> quando si esegue:
class Program
{
static async Task<int> Main(string[] args)
{
return await AsyncConsoleWork();
}
private static async Task<int> AsyncConsoleWork()
{
return 0;
}
}
Argomenti della riga di comando
Includere nella dichiarazione Main un parametro string[] args per accettare gli argomenti della riga di comando. Se non sono necessari, omettere il parametro . Il args parametro è una String matrice che non è mai null. Se non vengono forniti argomenti, il parametro Length è zero.
È possibile convertire gli argomenti stringa in altri tipi usando Parse o Convert:
long num = long.Parse(args[0]);
Suggerimento
L'analisi degli argomenti della riga di comando può essere complessa. Prendere in considerazione l'uso della libreria System.CommandLine per semplificare il processo.
Per un esempio funzionante, vedere Come visualizzare gli argomenti della riga di comando.
Specifiche del linguaggio C#
Per altre informazioni, vedere la specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.