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).

Praxishinweis

Der 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.