C# Spickzettel
Zuletzt aktualisiert
Hello World & Programmaufbau
Top-Level-Anweisungen (seit .NET 6) ersparen dir die Boilerplate-Klasse.
| Element | Code |
|---|---|
| Top-Level-Programm | Console.WriteLine("Hello, World!"); |
| Einen Namensraum importieren | using System; |
| Klassischer Einstiegspunkt | static void Main(string[] args) { ... } |
| Eine Zeile ausgeben | Console.WriteLine("text"); |
| Eine Zeile lesen | string s = Console.ReadLine(); |
| String-Interpolation | Console.WriteLine($"Hi {name}"); |
| Kommentare | // line und /* block */ |
Datentypen
| Typ | Beschreibung |
|---|---|
int | 32-Bit-Ganzzahl mit Vorzeichen |
long | 64-Bit-Ganzzahl mit Vorzeichen |
double / float | Gleitkommazahlen |
decimal | Dezimalzahl mit hoher Genauigkeit (Geldbeträge) |
bool | true oder false |
char | Einzelnes Unicode-Zeichen |
string | Unveränderlicher Text |
var | Der Compiler leitet den Typ ab |
int? | Nullbarer Werttyp |
Variablen
| Operation | Syntax |
|---|---|
| Deklarieren & initialisieren | int x = 5; |
| Typinferenz | var name = "Ada"; |
| Konstante | const double Pi = 3.14159; |
| Schreibgeschütztes Feld | readonly int id; |
| Nullbare Referenz | string? maybe = null; |
| Null-Coalescing | var y = maybe ?? "default"; |
| Null-bedingt | int? len = text?.Length; |
Kontrollfluss
| Anweisung | Syntax |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Switch-Anweisung | switch (n) { case 1: ...; break; default: ...; } |
| Switch-Ausdruck | var s = n switch { 1 => "one", _ => "other" }; |
| While-Schleife | while (i < n) { ... } |
| Do-while-Schleife | do { ... } while (i < n); |
| For-Schleife | for (int i = 0; i < n; i++) { ... } |
| Foreach-Schleife | foreach (var item in list) { ... } |
| Break / continue | break; verlässt eine Schleife, continue; springt zur nächsten Iteration |
Methoden
| Operation | Syntax |
|---|---|
| Eine Methode definieren | int Add(int a, int b) { return a + b; } |
| Ausdruckskörper | int Add(int a, int b) => a + b; |
| Kein Rückgabewert | void Greet() { ... } |
| Optionaler Parameter | int Pow(int b, int e = 2) { ... } |
| Benannte Argumente | Pow(b: 2, e: 3); |
| Out-Parameter | bool TryParse(string s, out int n) { ... } |
| Statische Methode | static int Square(int x) => x * x; |
| Lambda-Ausdruck | Func<int, int> f = x => x * 2; |
Klassen & OOP
| Operation | Syntax |
|---|---|
| Eine Klasse definieren | class Dog { ... } |
| Auto-Property | public string Name { get; set; } |
| Schreibgeschützte Property | public int Id { get; } |
| Konstruktor | public Dog(string name) { Name = name; } |
| Ein Objekt erstellen | var d = new Dog("Rex"); |
| Vererbung | class Puppy : Dog { ... } |
| Interface | interface IRunnable { void Run(); } |
| Eine Methode überschreiben | public override void Speak() { ... } |
| Record (unveränderlich) | record Point(int X, int Y); |
Collections
Generische Collections aus System.Collections.Generic.
| Typ | Verwendung & Beispiel |
|---|---|
List<T> | Dynamisches Array: list.Add(1); list.Count; |
Dictionary<K, V> | Schlüssel-Wert: dict["a"] = 1; dict.ContainsKey("a"); |
HashSet<T> | Eindeutige Werte: set.Add(5); set.Contains(5); |
Queue<T> | FIFO: q.Enqueue(x); q.Dequeue(); |
Stack<T> | LIFO: s.Push(x); s.Pop(); |
| Array | int[] nums = { 1, 2, 3 }; |
| Collection-Initialisierer | var l = new List<int> { 1, 2, 3 }; |
| Ein Dictionary durchlaufen | foreach (var kv in dict) { kv.Key; kv.Value; } |
LINQ
Collections flüssig abfragen; aus System.Linq.
| Operation | Syntax |
|---|---|
| Filtern | nums.Where(n => n > 0) |
| Projizieren / mappen | nums.Select(n => n * 2) |
| Sortieren | nums.OrderBy(n => n) / OrderByDescending(...) |
| Erster Treffer | nums.First(n => n > 5) / FirstOrDefault(...) |
| Any / all | nums.Any(n => n < 0) / nums.All(n => n > 0) |
| Treffer zählen | nums.Count(n => n > 0) |
| Aggregieren | nums.Sum(), nums.Max(), nums.Average() |
| Gruppieren nach | items.GroupBy(i => i.Category) |
| Materialisieren | .ToList() / .ToArray() |
Häufige Muster (Properties, async)
| Muster | Syntax |
|---|---|
| Async-Methode | async Task<int> GetAsync() { ... } |
| Auf einen Task warten | var result = await GetAsync(); |
| Try / catch | try { ... } catch (Exception e) { ... } |
| Finally | finally { ... } läuft immer |
| Using (dispose) | using var file = File.OpenRead(path); |
| String-Formatierung | $"Total: {amount:C}" |
| Generische Klasse | class Box<T> { public T Value; } |
| Pattern Matching | if (obj is Dog d) { d.Bark(); } |
Die C#-Syntax, Collections und LINQ-Abfragen, die du am häufigsten brauchst, auf einer Seite. Dieser C#-Spickzettel ist eine Schnellreferenz zum Schreiben von C# - die Datentypen, der Kontrollfluss, Klassen, die List/Dictionary-Collections, LINQ sowie die Property- und Async-Muster, die idiomatischen .NET-Code ausmachen.
Alles hier ist Standard-C# auf .NET und läuft mit der dotnet-CLI. Kopiere, was du brauchst, oder probiere jeden Codeschnipsel live im C#-Playground aus - kein SDK zu installieren.
C#-Spickzettel FAQ
Ist dieser C#-Spickzettel kostenlos?
Was ist der Unterschied zwischen Werttypen und Referenztypen in C#?
int, double, bool, struct, enum) halten ihre Daten direkt und werden bei der Zuweisung oder Übergabe an eine Methode kopiert - eine Änderung der Kopie wirkt sich nicht auf das Original aus. Referenztypen (class, string, Arrays, List<T>) halten eine Referenz auf Daten im Heap, sodass zwei Variablen auf dasselbe Objekt zeigen können und eine Änderung über die eine über die andere sichtbar ist. string ist ein Referenztyp, verhält sich aber unveränderlich.Was ist LINQ und wann sollte ich es verwenden?
Where, Select und OrderBy, mit denen du Collections mit gut lesbaren, verkettbaren Aufrufen filtern, transformieren und aggregieren kannst, statt mit manuellen Schleifen. Verwende es immer dann, wenn du sonst eine Schleife schreiben würdest, um eine gefilterte oder projizierte Liste aufzubauen - es ist kompakt und wird bis zum Aufruf von ToList() oder zur Iteration verzögert ausgewertet.