C#-Dokumentation
Kompakte, beispielorientierte C#-Referenz. Konzept lesen, Code ansehen, dann in einem Coddy-Lernweg üben.
Geführten C#-Lernweg startenErste Schritte
- Was ist C#C# ist eine statisch typisierte Allzwecksprache von Microsoft, die auf .NET läuft. Wofür sie verwendet wird, wie sie mit .NET zusammenhängt, was jede Version hinzugefügt hat und wie ein C#-Programm aufgebaut ist.
- Hello WorldDein erstes C#-Programm Zeile für Zeile: die Main-Methode, Console.WriteLine und Write, Eingaben lesen mit Console.ReadLine, Kommentare, ein Projekt mit der dotnet CLI anlegen und ausführen sowie Top-Level-Anweisungen.
- C# vs. JavaC# und Java sehen sich ähnlich und lösen ähnliche Probleme. Die echten Unterschiede liegen bei Properties, Werttypen, Generics, LINQ gegenüber Streams, async, Exceptions und den Ökosystemen drumherum. Ein direkter Vergleich mit Code.
- C# vs. C++C# ist eine verwaltete Sprache mit Garbage Collector; C++ kompiliert in nativen Code und gibt dir manuelle Kontrolle über den Speicher. Wie sich dieser Unterschied bei Sicherheit, Performance, Game Engines, Build-Modell und Lernaufwand zeigt.
- Namespaces und usingWie C#-Namespaces Typen organisieren und wie die using-Direktive sie importiert: Aliase, using static, vollqualifizierte Namen, mehrdeutige Verweise beheben, globale Usings und dateibezogene Namespaces.
Grundlagen
- VariablenWie du in C# Variablen deklarierst und zuweist, wann var eine gute Idee ist und wann nicht, wie der Gültigkeitsbereich funktioniert, der Unterschied zwischen const, readonly und static readonly, Namenskonventionen und der Fehler bei nicht zugewiesenen Variablen.
- DatentypenJeder eingebaute C#-Typ mit Größe, Wertebereich und Literal-Suffix, der Unterschied zwischen Wert- und Referenztypen, warum decimal der Typ für Geld ist, Integer-Überlauf und checked sowie Standardwerte.
- String in IntWie du in C# einen String mit int.Parse, int.TryParse und Convert.ToInt32 in ein int umwandelst, wie implizite und explizite Casts funktionieren, warum ein Cast von double abschneidet, die Operatoren as und is und warum "1.5" als 15 geparst werden kann.
- OperatorenDie C#-Operatoren mit ihrem genauen Verhalten: Ganzzahldivision, der Modulo-Operator mit negativen Zahlen, Inkrement und zusammengesetzte Zuweisung, Vergleiche, Kurzschlusslogik, bitweise Operatoren, die Null-Operatoren und eine Tabelle der Rangfolge.
- StringsWie Strings in C# funktionieren: Unveränderlichkeit, Length und Indizierung, Vergleich mit ==, Equals und string.Compare, Escape-Zeichen, Verbatim-Strings mit @ und mehrzeiliger Text, Raw-String-Literale, Prüfung auf null und leer sowie Schleifen über Zeichen.
- SubstringWie String.Substring in C# funktioniert: Startindex und Länge als Argumente, die ArgumentOutOfRangeException und wie du sie vermeidest, Text rund um IndexOf-Ergebnisse ausschneiden, die ersten oder letzten n Zeichen nehmen und der Bereichsoperator aus C# 8.
- String-InterpolationWie String-Interpolation mit $"..." in C# funktioniert: Ausdrücke in geschweiften Klammern, Formatbezeichner wie F2, N0, C, D5 und X, Ausrichtung für Tabellen, Klammern escapen, string.Format und kombinierte Formatierung, Verbatim- und Raw-Interpolation sowie Formatierung für eine bestimmte Kultur.
- String-MethodenDie String-Methoden, die du in C# jeden Tag brauchst: Split mit mehreren Trennzeichen und Optionen, Replace, Contains und Suche ohne Groß- und Kleinschreibung, IndexOf und LastIndexOf, StartsWith und EndsWith, Trim, ToUpper und ToLower, PadLeft, Join, Concat und einen String umkehren.
- StringBuilderWarum wiederholte String-Verkettung in einer Schleife in C# langsam ist und wie StringBuilder das löst: Append, AppendLine, AppendFormat, Insert, Remove, Replace, Kapazität und wann einfache Verkettung oder string.Join die bessere Wahl ist.
- ZufallszahlenWie du in C# mit der Klasse Random Zufallszahlen erzeugst: Next und seine exklusive Obergrenze, zufällige Doubles in einem Bereich, Seeds für reproduzierbare Ergebnisse, ein zufälliges Element wählen, eine Liste mischen, die Falle mit new Random in einer Schleife und kryptografisch sichere Zahlen.
- DateTimeMit Datum und Uhrzeit in C# arbeiten: DateTime-Werte erzeugen, Now vs. UtcNow vs. Today, Tage und Monate addieren, subtrahieren und einen TimeSpan erhalten, TotalHours vs. Hours, Datumswerte vergleichen, DayOfWeek, Parsen mit ParseExact und TryParse, DateTimeOffset und DateOnly.
- DateTime-FormatWie du in C# einen DateTime als String formatierst: die Standardformatstrings (d, D, o, s, u, t), benutzerdefinierte Muster wie yyyy-MM-dd HH:mm:ss, eine vollständige Tabelle der Bezeichner, wie die Kultur die Ausgabe ändert, ISO 8601 als Round-trip mit "o" und die Fehler mit mm vs. MM und hh vs. HH.
Kontrollfluss
- if elseWie if, else if und else in C# funktionieren: warum Bedingungen bool sein müssen, Tests mit &&, || und ! kombinieren, wann geschweifte Klammern zählen, Guard Clauses statt tiefer Verschachtelung und die Fehler mit = gegenüber == und dem verirrten Semikolon.
- switch-AnweisungWie die switch-Anweisung in C# funktioniert: switch auf int-, string-, char- und enum-Werte, warum jeder case ein break braucht (Fehler CS0163), case-Labels für mehrere Werte stapeln, goto case, default, Groß- und Kleinschreibung bei Strings und case-Labels mit Mustern und when.
- switch-AusdruckDer switch-Ausdruck aus C# 8 macht mit Muster-Armen statt case und break aus einem Wert ein Ergebnis. Syntax, der Discard _, Property-, Tupel- und relationale Muster, and/or/not, when-Guards, Warnungen zur Vollständigkeit und SwitchExpressionException, mit ausführbaren Entsprechungen in C# 7.
- Ternärer OperatorDer Bedingungsoperator condition ? a : b wählt in C# einen von zwei Werten. Wie er ausgewertet wird, warum beide Zweige einen gemeinsamen Typ brauchen (CS0173) und welcher Cast das behebt, verschachtelte ternäre Ausdrücke, Klammern in der String-Interpolation und wann ?? und ?. es besser sagen.
- for-SchleifeWie die for-Schleife in C# funktioniert: Initialisierer, Bedingung und Iterator, rückwärts zählen und Schrittweiten, mehrere Schleifenvariablen, Arrays per Index durchlaufen, verschachtelte Schleifen, for(;;) und die Bugs mit Off-by-one und Entfernen während der Iteration.
- foreach-SchleifeWie foreach in C# funktioniert: Arrays, Listen, Strings und Dictionaries durchlaufen (KeyValuePair und Dekonstruktion), den Index bekommen, warum die Schleifenvariable schreibgeschützt ist, die InvalidOperationException „Collection was modified“ und ihre Lösungen und was ein Typ braucht, um in foreach verwendet zu werden.
- while-SchleifeWie while- und do-while-Schleifen in C# funktionieren: die Bedingung vor oder nach dem Rumpf geprüft, Eingaben bis zu einem Endwert oder bis zum Ende der Eingabe lesen, while (true) mit break und die Endlosschleifen, über die man stolpert.
- break und continueWie break, continue und goto in C# funktionieren: eine Schleife vorzeitig beenden, einen Durchlauf überspringen, break in einem switch, drei Wege aus verschachtelten Schleifen (ein Flag, goto oder eine Methode mit return) und der Bug mit continue in while, der zur Endlosschleife führt.
Methoden und Delegates
- MethodenWie du in C# Methoden deklarierst und aufrufst: Rückgabetypen und void, Parameter, Methoden mit Ausdruckskörper, mehrere Werte als Tupel zurückgeben, Überladung, params-Arrays, statische gegenüber Instanzmethoden, die Main-Methode, Rekursion und lokale Funktionen.
- Optionale ParameterWie optionale Parameter und benannte Argumente in C# funktionieren: Standardwerte und die Regel der Konstante zur Kompilierzeit, Reihenfolge der Parameter, Argumente per Namen überspringen, optionale Parameter gegenüber Überladungen, Caller-Info-Attribute und die Versionsfalle von Standardwerten, die in den Aufrufer kompiliert werden.
- ref und outWie ref-, out- und in-Parameter in C# funktionieren: die Variable statt einer Kopie übergeben, out für zusätzliche Ergebnisse und das TryParse-Muster, out var, schreibgeschützte in-Parameter, die Regeln der definitiven Zuweisung und was sich ändert, wenn das Argument ein Referenztyp ist.
- Lambda-AusdrückeWie Lambda-Ausdrücke in C# funktionieren: die =>-Syntax in allen Formen, Lambdas in Func und Action speichern, sie an Methoden und LINQ übergeben, Anweisungslambdas, Closures über erfasste Variablen und der Bug beim Erfassen in for-Schleifen, den foreach nicht hat.
- DelegatesWas ein Delegate in C# ist und wie du ihn verwendest: einen Delegate-Typ deklarieren, ihn aus einer Methode, einem Lambda oder einer anonymen Methode erzeugen, ihn aufrufen, Delegates als Callbacks, Multicast-Delegates mit += und -=, Null-Prüfung mit ?.Invoke und wie Delegates mit Func, Action und Events zusammenhängen.
- Func und ActionWie Func und Action in C# funktionieren: Func<T, TResult> für Funktionen mit Rückgabewert, Action<T> für solche ohne, Predicate und Comparison, Funktionen übergeben und zurückgeben, ein Dictionary von Befehlen, async-Lambdas und wann du stattdessen einen eigenen Delegate deklarierst.
- EventsWie Events in C# funktionieren: ein Event mit EventHandler und EventHandler<T> deklarieren, eigene EventArgs-Klassen, mit += und -= abonnieren und abmelden, ein Event sicher mit ?.Invoke auslösen, warum ein Event besser ist als ein öffentliches Delegate-Feld und das Speicherleck durch ein vergessenes Abmelden.
- ErweiterungsmethodenWie Erweiterungsmethoden in C# funktionieren: eine statische Methode in einer statischen Klasse mit this am ersten Parameter, Aufruf wie eine Instanzmethode, string, Enums und IEnumerable<T> erweitern, wie LINQ daraus gebaut ist, warum Instanzmethoden Vorrang haben, null als Empfänger und die using-Direktive, die sie brauchen.
Collections und LINQ
- ArraysEin C#-Array ist ein Block fester Größe mit Elementen eines Typs. Lerne, wie du Arrays deklarierst und initialisierst, Length liest, mit der Klasse Array sortierst und suchst, sie sicher kopierst und mit 2D- und Jagged Arrays arbeitest.
- ListList<T> ist das wachsende Array von C#. Lerne, wie du eine Liste erzeugst, Elemente hinzufügst und einfügst, nach Wert, Index oder Bedingung entfernst, mit Contains und Find suchst, nach einer Property sortierst und den Fehler vermeidest, der beim Ändern einer Liste in foreach entsteht.
- DictionaryDictionary<TKey, TValue> bildet Schlüssel mit schnellem Nachschlagen auf Werte ab. Lerne, wie du Einträge hinzufügst und aktualisierst, sicher mit TryGetValue liest, KeyValuePair-Einträge durchläufst, Vorkommen zählst, Groß- und Kleinschreibung in Schlüsseln ignorierst und Schlüssel mit SortedDictionary sortiert hältst.
- HashSetHashSet<T> enthält eindeutige Elemente und beantwortet Contains in konstanter Zeit. Lerne, wie Add Duplikate meldet, wie du Duplikate aus einer Liste entfernst, wie du Mengen vereinigst, schneidest und subtrahierst und wie ein Set deine eigenen Objekte nach Wert vergleicht.
- QueueQueue<T> ist eine Collection nach dem Prinzip first in, first out: Elemente verlassen sie in der Reihenfolge, in der sie ankamen. Lerne Enqueue, Dequeue und Peek, die Exception bei leerer Queue und TryDequeue, Breitensuche mit einer Queue und wann du zu ConcurrentQueue oder PriorityQueue greifst.
- StackStack<T> ist eine Collection nach dem Prinzip last in, first out: Das zuletzt hinzugefügte Element kommt zuerst heraus. Lerne Push, Pop und Peek, die Exception bei leerem Stack und TryPop, warum ein Stack in umgekehrter Reihenfolge durchlaufen wird, und zwei klassische Einsätze: eine Undo-Historie und die Prüfung ausgeglichener Klammern.
- TupelEin C#-Tupel fasst ein paar Werte zu einem zusammen, ohne einen Typ zu deklarieren. Lerne die Syntax von Werttupeln, benannte Elemente, mehrere Werte aus einer Methode zurückgeben, Dekonstruktion mit var (a, b), Tupel als Dictionary-Schlüssel und wie sich ValueTuple vom älteren System.Tuple unterscheidet.
- LINQLINQ gibt jeder Collection in C# Abfrageoperatoren. Lerne Methodensyntax und Abfragesyntax, Filtern mit Where, Projizieren mit Select, Sortieren mit OrderBy und ThenBy, Gruppieren mit GroupBy, die Falle zwischen First und FirstOrDefault, Aggregate und wie die verzögerte Ausführung bestimmt, wann deine Abfrage läuft.
- IEnumerable und yieldIEnumerable<T> ist das Interface hinter foreach und LINQ, und yield return ist der einfachste Weg, es zu implementieren. Lerne, wie IEnumerable mit ICollection und List zusammenhängt, wie eine Iteratormethode Schritt für Schritt läuft, yield break, unendliche Sequenzen und die Fallen der verzögerten Auswertung.
Klassen und Typen
- Klassen und ObjekteWie du in C# eine Klasse deklarierst, ihr Felder und Methoden gibst, Objekte mit new erzeugst und was es bedeutet, dass eine Klasse ein Referenztyp ist: geteilte Objekte, null und NullReferenceException, ToString und Objektinitialisierer.
- KonstruktorenWie Konstruktoren in C# funktionieren: der implizite Standardkonstruktor und wann er verschwindet, Konstruktoren mit Parametern und Überladungen, Verkettung mit this(...) und base(...), die Reihenfolge der Ausführung, statische und private Konstruktoren und primäre Konstruktoren aus C# 12.
- PropertiesWie Properties in C# funktionieren: get- und set-Accessoren über einem Hintergrundfeld, Auto-Properties, private set und schreibgeschützte Properties, berechnete Properties, Validierung in Settern und die Schlüsselwörter init und required aus C# 9 und 11.
- Schlüsselwort staticWas static in C# bedeutet: Member, die zum Typ statt zu einem Objekt gehören, über Instanzen geteilter Zustand, statische Methoden und statische Klassen, statische Konstruktoren, const vs. static readonly, using static und der Fehler CS0120.
- ZugriffsmodifiziererDie sechs Zugriffsmodifizierer in C# (public, private, protected, internal, protected internal, private protected), was jeder erlaubt, die Standardwerte, wenn du keinen angibst, und die Compilerfehler, die sie erzeugen.
- VererbungWie Klassenvererbung in C# funktioniert: mit einem Doppelpunkt ableiten, was vererbt wird und was nicht, die Basisklasse mit base aufrufen, virtual und override, Verdecken mit new (und die Ausgabe, die jeden überrascht), sealed, Polymorphie und Casts nach oben und unten in einer Hierarchie.
- Abstrakte KlassenWas eine abstrakte Klasse in C# ist: eine Basisklasse, die sich nicht instanziieren lässt und abstrakte Member deklarieren kann, die ihre abgeleiteten Klassen implementieren müssen. Behandelt abstrakte Methoden und Properties, Konstruktoren, das Template-Method-Muster und wann stattdessen ein Interface passt.
- InterfacesWie Interfaces in C# funktionieren: eines deklarieren, es in Klassen und Structs implementieren, das Interface als Typ verwenden, mehrere gleichzeitig implementieren, explizite Implementierung, die Framework-Interfaces, die du am häufigsten implementierst (IComparable<T>, IEnumerable<T>, IDisposable), und Standard-Interface-Methoden aus C# 8.
- StructsWie Structs in C# funktionieren: Wertsemantik und Kopieren bei der Zuweisung, der Fehler beim Ändern in einer List<T>, Regeln für Konstruktoren, Gleichheit, Boxing, readonly struct und record struct sowie ein Vergleich Struct gegenüber Klasse mit Hinweisen, wann ein Struct die richtige Wahl ist.
- EnumsWie Enums in C# funktionieren: benannte Konstanten deklarieren, zugrunde liegende Ganzzahlwerte und Casts, ein Enum in einen String und einen String mit Parse und TryParse in ein Enum umwandeln, alle Werte auflisten, [Flags] mit bitweisen Operatoren und HasFlag, switch über ein Enum und der Umgang mit undefinierten Werten.
- RecordsWas Records in C# sind (ab C# 9): positionelle Syntax, die Member, die der Compiler erzeugt, wertbasierte Gleichheit, nicht destruktive Kopien mit with, das eingebaute ToString, record struct aus C# 10, Vererbung zwischen Records und die gleichwertige, von Hand geschriebene Klasse.
- GenericsWie Generics in C# funktionieren: generische Klassen und Methoden mit Typparametern schreiben, Typinferenz, Constraints mit where (class, struct, new(), Basisklassen, Interfaces), default(T), statische Member pro Typ und Kovarianz mit IEnumerable<out T>.
- Nullable-TypenAlles über null in C#: Nullable-Werttypen (int?, Nullable<T>) mit HasValue, Value und GetValueOrDefault, die Null-Sammeloperatoren ?? und ??=, der Null-bedingte Operator ?., Null-Prüfungen und Nullable-Referenztypen (string?) aus C# 8.
- Pattern MatchingWie Pattern Matching in C# funktioniert: der Operator is mit Typ- und Konstantenmustern, switch-Anweisungen mit case-Mustern und when, switch-Ausdrücke, Property-, Tupel- und positionelle Muster, relationale und logische Muster (and, or, not), Listenmuster und welche C#-Version jedes davon eingeführt hat.
Ausnahmen
- try catchtry, catch und finally sind die Art, wie C# Exceptions behandelt. Lerne, wie eine Exception den Aufrufstapel hinaufwandert, wie du bestimmte Exception-Typen in der richtigen Reihenfolge abfängst, mit when filterst, in finally aufräumst, mit throw; erneut wirfst, ohne den Stacktrace zu verlieren, und welche Exceptions du nicht abfangen solltest.
- Exceptions werfenWie und wann du in C# Exceptions wirfst. Lerne die throw-Anweisung, welcher eingebaute Exception-Typ zu welchem Fehler passt, throw-Ausdrücke mit ?? und ?:, die Hilfsmethoden ThrowIfNull und wie du eine eigene Exception-Klasse mit eigenen Daten und einer inneren Exception schreibst.
- using-AnweisungDie using-Anweisung garantiert, dass Dispose für Dateien, Streams, Verbindungen und andere IDisposable-Objekte aufgerufen wird, auch wenn eine Exception geworfen wird. Lerne, wozu sie kompiliert wird, in welcher Reihenfolge Objekte freigegeben werden, die using-Deklaration aus C# 8 und wie du IDisposable in deiner eigenen Klasse implementierst.
Async und Threads
- async awaitMit async und await kann C#-Code auf langsame Operationen warten, ohne einen Thread zu blockieren. Lerne, wie eine async-Methode läuft, Task und Task<T>, unabhängige Operationen mit Task.WhenAll gleichzeitig ausführen, Exceptions in async-Code und warum async void und .Result Bugs und Deadlocks verursachen.
- TasksTask ist die Einheit für asynchrone und parallele Arbeit in .NET. Lerne Task.Run für CPU-lastige Arbeit, Ergebnisse lesen, Tasks mit WhenAll und WhenAny kombinieren, Fortsetzungen, Abbruch mit CancellationToken, wie sich ein Task von einem Thread unterscheidet und wann Parallel.For besser passt.
- lock-AnweisungDie lock-Anweisung lässt immer nur einen Thread gleichzeitig einen Codeblock ausführen. Sieh, wie eine Race Condition einen Zähler verfälscht, behebe sie mit lock, lerne, auf welches Objekt du lockst, nimm Interlocked für einfache Zähler, vermeide Deadlocks durch die Reihenfolge von Locks und nimm SemaphoreSlim, wenn der Code darin await verwendet.
- TimerC# hat mehrere Timer-Klassen, und sie verhalten sich unterschiedlich. Lerne, wann du System.Threading.Timer, System.Timers.Timer, PeriodicTimer oder einen UI-Timer verwendest, wie du sie startest und stoppst, warum Callbacks im Thread-Pool laufen und sich überlappen können, warum ein Timer referenziert bleiben muss und wie du mit Stopwatch vergangene Zeit misst.
Dateien, JSON und mehr
- Dateien lesen und schreibenWie du in C# in eine Datei schreibst und eine Datei liest: File.WriteAllText, ReadAllText, AppendAllText, WriteAllLines und ReadAllLines für ganze Dateien, StreamWriter und StreamReader für große, Pfade mit Path.Combine, Verzeichnisse, Kodierungen und die Exceptions, die Dateicode behandeln muss.
- JSONWie du in C# mit System.Text.Json mit JSON arbeitest: JsonSerializer.Serialize und Deserialize, camelCase und eingerückte Ausgabe, Attribute wie JsonPropertyName und JsonIgnore, Enums als Strings, JSON ohne Klassen lesen mit JsonDocument und JsonNode, Fehler und der Vergleich mit Newtonsoft.Json.
- RegexWie du in C# reguläre Ausdrücke mit System.Text.RegularExpressions verwendest: IsMatch, Match und Matches, nummerierte und benannte Gruppen, Replace mit Ersetzungsmustern und einem Lambda, Split, RegexOptions, Verbatim-Strings für Muster, Eingaben validieren, Timeouts und das Attribut GeneratedRegex aus .NET 7.
- Reflection und AttributeWie Reflection in C# funktioniert: Type-Objekte aus typeof und GetType, Properties lesen und setzen, Methoden per Namen aufrufen, Instanzen erzeugen, und Attribute: die eingebauten wie Obsolete, eigene deklarieren und sie zur Laufzeit lesen. Dazu, was Reflection kostet.