Einleitung: Warum C# kompliziert erscheint, obwohl es das nicht ist
\n\nSie haben sich entschieden, C# zu lernen – eine ausgezeichnete Wahl. Es ist eine leistungsstarke, moderne Sprache, in der Spiele in Unity, Unternehmenssysteme, Webanwendungen und sogar Teile des Windows-Betriebssystems geschrieben sind. Aber wie jede Sprache hat auch C# seine „Fallstricke“, auf die fast alle Anfänger treten.
\n\nDas Problem ist nicht, dass C# kompliziert ist. Das Problem ist, dass viele falsch lernen: Sie pauken die Syntax, ohne die Logik zu verstehen, kopieren Code aus dem Internet ohne Nachdenken und ignorieren grundlegende Konzepte. In diesem Artikel analysieren wir die häufigsten Fehler beim Lernen von C#, die Anfänger machen, und zeigen, wie man sie behebt. Sie erfahren nicht nur „wie man es nicht macht“, sondern erhalten auch funktionierende Codebeispiele.
\n\nTop-7 typische Anfängerfehler in C# (mit Beispielen)
\n\n1. Verwechslung von Wert- und Referenztypen
\n\nDies ist wohl der häufigste Fehler von C#-Anfängern. In C# werden alle Typen in zwei große Gruppen unterteilt: value types (int, bool, struct) und reference types (class, string, array). Anfänger denken oft, dass Änderungen an einem Objekt, das sie an eine Methode übergeben haben, sich nicht nach außen auswirken – oder umgekehrt.
\n\nBeispiel für einen Fehler:
\npublic class Player\n{\n public int Health { get; set; }\n}\n\npublic void TakeDamage(Player player)\n{\n player.Health -= 10; // Ändert das Objekt\n}\n\n// Verwendung:\nvar hero = new Player { Health = 100 };\nTakeDamage(hero);\nConsole.WriteLine(hero.Health); // Gibt 90 aus – korrekt, aber der Anfänger ist überrascht\n\nUnd nun ein Beispiel mit struct (Werttyp):
\npublic struct Point\n{\n public int X;\n public int Y;\n}\n\npublic void MovePoint(Point p)\n{\n p.X = 10; // Das ändert das Original nicht!\n}\n\n// Verwendung:\nvar point = new Point { X = 0, Y = 0 };\nMovePoint(point);\nConsole.WriteLine(point.X); // Gibt 0 aus – eine Kopie!\n\nWie man es vermeidet: Merken Sie sich die Regel: class – wird als Referenz übergeben (wir ändern das Original), struct – als Wert (wir arbeiten mit einer Kopie). Geben Sie für struct immer einen neuen Wert zurück oder verwenden Sie ref.
2. Ignorieren der Ausnahmebehandlung (oder umgekehrt – leerer catch)
\n\nAnfänger schreiben oft Code, der bei der ersten ungewöhnlichen Eingabe abstürzt. Oder, noch schlimmer, sie verwenden einen leeren catch { }, der den Fehler „verschluckt“. Dies ist einer der häufigen C#-Fehler, der zu schwer auffindbaren Bugs führt.
Schlechtes Beispiel:
\ntry\n{\n int number = int.Parse(Console.ReadLine());\n Console.WriteLine(100 / number);\n}\ncatch { } // Fehler wird geschluckt, das Programm läuft stillschweigend falsch weiter\n\nGutes Beispiel:
\ntry\n{\n int number = int.Parse(Console.ReadLine());\n Console.WriteLine(100 / number);\n}\ncatch (FormatException ex)\n{\n Console.WriteLine($"Formatfehler: {ex.Message}");\n}\ncatch (DivideByZeroException)\n{\n Console.WriteLine("Division durch Null ist nicht erlaubt!");\n}\nfinally\n{\n Console.WriteLine("Der finally-Block wird immer ausgeführt");\n}\n\nTipp: Behandeln Sie nur die Ausnahmen, die Sie verstehen. Für alle anderen – protokollieren und werfen Sie sie weiter. Verwenden Sie kein nacktes catch ohne Parameter.
3. Falsche Verwendung von Zeichenketten (String vs StringBuilder)
\n\nC#-Zeichenketten sind unveränderlich. Jedes Mal, wenn Sie str += "something" schreiben, wird eine neue Zeichenkette erstellt, während die alte im Speicher für den Garbage Collector verbleibt. In einer Schleife mit 1000 Iterationen führt dies zu einem drastischen Leistungsabfall.
Anfängerfehler:
\nstring result = "";\nfor (int i = 0; i < 1000; i++)\n{\n result += i.ToString(); // Jede Iteration erzeugt eine neue Zeichenkette!\n}\nConsole.WriteLine(result);