Main()-Rückgabewerte (C#-Programmierhandbuch)Main() return values (C# Programming Guide)

Die Methode Main kann void zurückgeben:The Main method can return void:

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

Zudem kann int zurückgegeben werden:It can also return an int:

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.If the return value from Main is not used, returning void allows for slightly simpler 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.However, returning an integer enables the program to communicate status information to other programs or scripts that invoke the executable file. Der Rückgabewert von Main wird als Exitcode für den Prozess behandelt.The return value from Main is treated as the exit code for the process. Im folgenden Beispiel wird gezeigt, wie auf den Rückgabewert von Main zugegriffen werden kann.The following example shows how the return value from Main can be accessed.

BeispielExample

Dieses Beispiel verwendet .NET Core -Befehlszeilentools.This example uses .NET Core command line tools. Wenn Sie mit den .NET Core-Befehlszeilentools nicht vertraut sind, finden Sie weitere Informationen darüber im Get started topic (Thema Erste Schritte).If you are unfamilar with .NET Core command line tools, you can learn about them in this Get started topic.

Ändern Sie die Methode Main in program.cs folgendermaßen:Modify the Main method in program.cs as follows:

// 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.When a program is executed in Windows, any value returned from the Main function is stored in an environment variable. Diese Umgebungsvariable kann abgerufen werden, indem ERRORLEVEL aus einer Batchdatei oder $LastExitCode aus PowerShell verwendet wird.This environment variable can be retrieved using ERRORLEVEL from a batch file, or $LastExitCode from powershell.

Sie können die Anwendung mithilfe des Befehls dotnet CLI dotnet build erstellen.You can build the application using the dotnet CLI dotnet build command.

Als nächstes erstellen Sie ein PowerShell-Skript, das die Anwendung ausführt und die Ergebnisse anzeigt.Next, create a Powershell script to run the application and display the result. Fügen Sie folgenden Code in eine Textdatei ein und speichern Sie diese als test.ps1 in dem Ordner, der das Projekt enthält.Paste the following code into a text file and save it as test.ps1 in the folder that contains the project. Führen Sie das PowerShell-Skript aus, indem Sie test.ps1 in die PowerShell-Eingabeaufforderung eingeben.Run the powershell script by typing test.ps1 at the powershell prompt.

Da der Code null zurückgibt, wird die Batchdatei als erfolgreich gemeldet.Because the code returns zero, the batch file will report success. 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.However, if you change MainReturnValTest.cs to return a non-zero value and then re-compile the program, subsequent execution of the powershell script will report failure.

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

Beispielausgabe:Sample output

Execution succeeded
Return value = 0

Asynchrone HauptrückgabewerteAsync Main return values

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.Async Main return values move the boilerplate code necessary for calling asynchronous methods in Main to code generated by the compiler. 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:Previously, you would need to write this construct to call asynchronous code and ensure your program ran until the asynchronous operation completed:

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:Now, this can be replaced by:

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

Der Vorteil der neuen Syntax ist, dass der Compiler immer den richtigen Code generiert.The advantage of the new syntax is that the compiler always generates the correct code.

Vom Compiler generierter CodeCompiler generated 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.When the application entry point returns a Task or Task<int>, the compiler generates a new entry point that calls the entry point method declared in the application code. Unter der Annahme, dass dieser Einstiegspunkt als $GeneratedMain bezeichnet wird, generiert der Compiler den folgenden Code für diese Einstiegspunkte:Assuming that this entry point is called $GeneratedMain, the compiler generates the following code for these entry points:

  • static Task Main() führt dazu, dass der Compiler das Äquivalent zu private static void $GeneratedMain() => Main().GetAwaiter().GetResult(); ausgibtstatic Task Main() results in the compiler emitting the equivalent of private static void $GeneratedMain() => Main().GetAwaiter().GetResult();
  • static Task Main(string[]) führt dazu, dass der Compiler das Äquivalent zu private static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult(); ausgibtstatic Task Main(string[]) results in the compiler emitting the equivalent of private static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();
  • static Task<int> Main() führt dazu, dass der Compiler das Äquivalent zu private static int $GeneratedMain() => Main().GetAwaiter().GetResult(); ausgibtstatic Task<int> Main() results in the compiler emitting the equivalent of private static int $GeneratedMain() => Main().GetAwaiter().GetResult();
  • static Task<int> Main(string[]) führt dazu, dass der Compiler das Äquivalent zu private static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult(); ausgibtstatic Task<int> Main(string[]) results in the compiler emitting the equivalent of private static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();

Hinweis

Wäre im Beispiel der Modifizierer async auf die Methode Main angewendet worden, hätte der Compiler denselben Code generiert.If the examples used async modifier on the Main method, the compiler would generate the same code.

Siehe auchSee also

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)C# Programming Guide C# Reference Main() and Command-Line Arguments How to: Display Command Line Arguments How to: Access Command-Line Arguments Using foreach