Top-Level Statement
Eintrag zuletzt aktualisiert am: 29.01.2026
Seit
C# 9.0 ist die Verwendung einer Einsprungmethode Main() in der Klasse Program nicht mehr verpflichtend für C#-basierte Abwendungen. Man kann als Startcode der Anwendung auch direkt freien Programmcode in eine beliebige .cs-Datei schreiben, z.B.
using System;
Console.WriteLine("Hello World");
oder sogar in eine Zeile
System.Console.WriteLine("Hello World");
Intern erzeugt der C#-
Compiler aus den Top-Level-Statements doch wieder eine class Program mit Main()-
Methode.
Sofern es innerhalb des Top-Level-Codes ein
await gibt
string GetNETVersion()
{
return
System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription;
}
CUI.H1("C# Top-Level Statements (seit
C# 9.0)");
Console.WriteLine("Hole Daten...");
await System.Threading.Tasks.Task.Delay(1000);
Console.WriteLine(GetNETVersion());
Console.ReadLine();
erzeugt der
Compiler automatisch eine den Einsprungpunkt Main() mit dem Zusatz async:
Hinweise:- Die Übergabe von Parametern ist aber auch ohne class Program und Main()-Methode möglich, da auch bei Top-Level-Statements die Variable args zur Verfügung steht. Dafür sorgt der Compiler.
- Es darf natürlich in einem C#-Projekt nicht mehr als eine Datei geben, die solch freien Code enthält, sonst wäre der Einsprungpunkt der Anwendung nicht mehr eindeutig. Der Compiler beschwert sich dann "Error CS8802: Only one compilation unit can have top-level statements."
- Falls es ein Top-Level Statement und ein void Main() gibt, wird void Main() ignoriert!
- Zu beachten ist auch, dass in der Datei mit dem Top-Level-Statement keine Namensraumdeklaration mit File-Scoped Namespaces erfolgen kann (CS0116: A namespace cannot directly contain members such as fields, methods or statements) und die Programmstart-Befehle vor allen in der Datei ebenfalls noch möglichen Typdeklarationen stehen müssen (CS8803: Top-level statements must precede namespace and type declarations).
PraxishinweisDer Einsatz dieses Sprachfeatures ist umstritten. Microsoft schreibt dazu: "One of the most common uses for this feature is creating teaching materials. Beginner C# developers can write the canonical “Hello World!” in one or two lines of code. None of the extra ceremony is needed."
Der Autor dieses Buchs sieht allerdings mit Top-Level-Statement die Gefahr, dass der Code unübersichtlicher wird. Der Einsprungpunkt einer Anwendung ist nicht mehr auf Anhieb zu finden und man schreibt leicht aus Versehen ein Top-Level-Statement! Der Autor dieses Beitrags sieht in dem Weglassen von Main() allenfalls ein Einsatzgebiet und zwar im Einsatz von C# als Skriptsprache, wo das Skript nur aus einer Datei besteht.