Dein erstes C#-Programm
Ein modernes C#-Programm Zeile fuer Zeile: Top-Level Statements, Console-Ausgabe, String-Interpolation und die klassische Variante mit Main-Methode.
Inhaltsverzeichnis
Dein erstes C#-Programm
Das โHello, World!โ aus der Installation war kurz. Schauen wir uns genauer an, was dahinter steckt, und wie wir es erweitern.
Die moderne Form: Top-Level Statements
Eine Program.cs kann so einfach sein:
Console.WriteLine("Hallo, C#!");
Das ist ein komplettes C#-Programm. Der Compiler wickelt es im Hintergrund in eine Main-Methode - du musst dich darum nicht kuemmern.
Variablen nutzen
var name = "Anna";
var alter = 28;
Console.WriteLine($"Hallo, {name}! Du bist {alter} Jahre alt.");
Das $ vor dem String macht ihn zu einem interpolierten String - Platzhalter in {} werden durch den Wert des Ausdrucks ersetzt. Viel lesbarer als "Hallo, " + name + "!".
Nutzereingabe
Console.Write("Wie heisst du? ");
var name = Console.ReadLine();
Console.WriteLine($"Hallo, {name}!");
Console.Write- ohne ZeilenumbruchConsole.WriteLine- mit ZeilenumbruchConsole.ReadLine- liest eine Zeile vom Nutzer
Die klassische Form
Aeltere C#-Tutorials (und viele Firmenprojekte) nutzen noch den langen Stil. Den solltest du verstehen koennen:
using System;
namespace HalloCSharp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hallo, C#!");
}
}
}
using System;- importiert denSystem-Namespace (fuerConsole). Seit C# 10 gibt es global usings, damit das oft automatisch passiert.namespace- logische Gruppierung (wie Packages in Java)class Program- die Container-Klassestatic void Main(string[] args)- der klassische Einstiegspunkt
Beide Formen sind gueltig. Modernere Projekte nutzen Top-Level Statements.
Formate und Strings
C# hat drei Haupt-Stile fuer String-Ausgabe:
1. Interpolation (meistverwendet)
var name = "Anna";
var punkte = 95.5;
Console.WriteLine($"{name} hat {punkte:F1} Punkte.");
:F1 = Fliesskomma mit 1 Nachkommastelle โ โAnna hat 95.5 Punkte.โ
2. Composite Formatting
Console.WriteLine("{0} hat {1:F1} Punkte.", name, punkte);
Funktional identisch zu Interpolation, aber weniger lesbar.
3. Konkatenation
Console.WriteLine(name + " hat " + punkte + " Punkte.");
Vermeiden, wenn moeglich - unuebersichtlich und ineffizient.
Mehr Formate
var pi = 3.14159;
var datum = DateTime.Now;
var prozent = 0.85;
Console.WriteLine($"{pi:F2}"); // 3.14
Console.WriteLine($"{pi:F0}"); // 3
Console.WriteLine($"{datum:yyyy-MM-dd}"); // 2026-04-24
Console.WriteLine($"{prozent:P0}"); // 85%
Console.WriteLine($"{1234567:N0}"); // 1,234,567 (mit Tausendertrennern)
Kleine Erweiterung
using System;
Console.Write("Wie heisst du? ");
var name = Console.ReadLine();
Console.Write("Wie alt bist du? ");
var input = Console.ReadLine();
if (int.TryParse(input, out var alter))
{
if (alter >= 18)
Console.WriteLine($"Hallo, {name}! Du bist volljaehrig.");
else
Console.WriteLine($"Hallo, {name}! Du bist noch {18 - alter} Jahre von 18 entfernt.");
}
else
{
Console.WriteLine("Das war keine gueltige Zahl.");
}
int.TryParse
TryParse versucht zu konvertieren. Wenn es klappt, steht der Wert in alter und der Aufruf gibt true zurueck. Bei Misserfolg bekommst du false - ohne Exception.
Das out var ist C#-Kurzform: Die Variable alter wird inline deklariert.
Namespaces & using
Wenn du zusaetzliche Bibliotheken brauchst, importierst du sie mit using:
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
Seit C# 10 sind viele davon implizit - du siehst sie nicht im Code, aber sie sind aktiv. Das wird in der .csproj gesteuert:
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Mit ImplicitUsings enable sparst du dir die Standard-using-Zeilen.
Exit-Codes
Ein Konsolenprogramm kann einen Exit-Code zurueckgeben:
if (args.Length == 0)
{
Console.Error.WriteLine("Bitte einen Namen uebergeben.");
return 1;
}
Console.WriteLine($"Hallo, {args[0]}!");
return 0;
In Top-Level-Statement-Programmen ist args automatisch verfuegbar.
Zusammenfassung
- Top-Level Statements machen modernen C#-Code sehr kurz
Console.WriteLine,Console.ReadLinefuer Ein-/Ausgabe$"..."fuer lesbare String-Interpolationint.TryParsefuer sichere Konvertierung ohne Exceptionsusingimportiert Namespaces; global usings sparen Zeilen
Im naechsten Kapitel: Variablen und Datentypen im Detail.