Main()-Rückgabewerte (C#-Programmierhandbuch)

Die Methode Main kann void zurückgeben:

static void Main()
{
    //...
}

Zudem kann int zurückgegeben werden:

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

Wenn der Rückgabewert von Main nicht verwendet wird, ermöglicht die Rückgabe von void einen etwas einfacheren Code. Die Rückgabe einer Ganzzahl ermöglicht es dem Programm jedoch, Statusinformationen an andere Programme oder Skripts zu übermitteln, die die ausführbare Datei aufrufen. Der Rückgabewert von Main wird als Exitcode für den Prozess behandelt. Im folgenden Beispiel wird gezeigt, wie auf den Rückgabewert von Main zugegriffen werden kann.

Beispiel

Dieses Beispiel verwendet .NET Core -Befehlszeilentools. Wenn Sie mit den .NET Core-Befehlszeilentools nicht vertraut sind, finden Sie weitere Informationen darüber im Get started topic (Thema Erste Schritte).

Ändern Sie die Methode Main in program.cs folgendermaßen:

// Save this program as MainReturnValTest.cs.
class MainReturnValTest
{
    static int Main()
    {
        //...
        return 0;
    }
}

Wenn ein Programm in Windows ausgeführt wird, wird jeder Wert, der von der Funktion Main zurückgegeben wurde, in einer Umgebungsvariable gespeichert. Diese Umgebungsvariable kann abgerufen werden, indem ERRORLEVEL aus einer Batchdatei oder $LastExitCode aus PowerShell verwendet wird.

Sie können die Anwendung mithilfe des Befehls dotnet CLI dotnet build erstellen.

Als nächstes erstellen Sie ein PowerShell-Skript, das die Anwendung ausführt und die Ergebnisse anzeigt. Fügen Sie folgenden Code in eine Textdatei ein und speichern Sie diese als test.ps1 in dem Ordner, der das Projekt enthält. Führen Sie das PowerShell-Skript aus, indem Sie test.ps1 in die PowerShell-Eingabeaufforderung eingeben.

Da der Code null zurückgibt, wird die Batchdatei als erfolgreich gemeldet. Wenn Sie jedoch „MainReturnValTest.cs“ ändern, damit sie einen Wert ungleich null zurückgibt, und anschließend das Programm erneut kompilieren, wird eine nachfolgende Ausführung des PowerShell-Skripts einen Fehler melden.

dotnet run
if ($LastExitCode -eq 0) {
    Write-Host "Execution succeeded"
} else
{
    Write-Host "Execution Failed"
}
Write-Host "Return value = " $LastExitCode

Beispielausgabe:

Execution succeeded
Return value = 0

Asynchrone Hauptrückgabewerte

Asynchrone Hauptrückgabewerte verschieben die Codebausteine, die zum Abrufen von asynchronen Methoden benötigt werden, nach Main zu dem Code, der vom Compiler generiert wurde. Bisher mussten Sie dieses Konstrukt schreiben, um asynchronen Code abzurufen und prüfen, ob Ihr Programm ausgeführt wurde, bevor der asynchrone Vorgang abgeschlossen ist:

public static void Main()
{
    AsyncConsoleWork().GetAwaiter().GetResult();
}

private static async Task<int> AsyncConsoleWork()
{
    // Main body here
    return 0;
}

Dies kann nun durch Folgendes ersetzt werden:

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

Der Vorteil der neuen Syntax ist, dass der Compiler immer den richtigen Code generiert.

Vom Compiler generierter Code

Wenn der Einstiegspunkt der Anwendung Task oder Task<int> zurückgibt, generiert der Compiler einen neuen Eingangspunkt, der die Eingangspunktmethode abruft, die im Anwendungscode deklariert wurde. Unter der Annahme, dass dieser Einstiegspunkt als $GeneratedMain bezeichnet wird, generiert der Compiler den folgenden Code für diese Einstiegspunkte:

  • static Task Main() führt dazu, dass der Compiler das Äquivalent zu private static void $GeneratedMain() => Main().GetAwaiter().GetResult(); ausgibt
  • static Task Main(string[]) führt dazu, dass der Compiler das Äquivalent zu private static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult(); ausgibt
  • static Task<int> Main() führt dazu, dass der Compiler das Äquivalent zu private static int $GeneratedMain() => Main().GetAwaiter().GetResult(); ausgibt
  • static Task<int> Main(string[]) führt dazu, dass der Compiler das Äquivalent zu private static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult(); ausgibt
Hinweis

Wäre im Beispiel der Modifizierer async auf die Methode Main angewendet worden, hätte der Compiler denselben Code generiert.

Siehe auch

C# Programming Guide (C#-Programmierhandbuch) C# Reference (C#-Referenz) Main() and Command-Line Arguments (Main() und Befehlszeilenargumente) How to: Display Command Line Arguments (Vorgehensweise: Anzeigen von Befehlszeilenargumenten) How to: Access Command-Line Arguments Using foreach (Vorgehensweise: Zugreifen auf Befehlszeilenargumente mithilfe von foreach)