Fehler beim Lernen von C#: Was Anfänger tun (und wie man sie vermeidet)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum C# kompliziert erscheint, obwohl es das nicht ist

\n\n

Sie 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\n

Das 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\n

Top-7 typische Anfängerfehler in C# (mit Beispielen)

\n\n

1. Verwechslung von Wert- und Referenztypen

\n\n

Dies 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\n

Beispiel für einen Fehler:

\n
public 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\n

Und nun ein Beispiel mit struct (Werttyp):

\n
public 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\n

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

\n\n

2. Ignorieren der Ausnahmebehandlung (oder umgekehrt – leerer catch)

\n\n

Anfä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.

\n\n

Schlechtes Beispiel:

\n
try\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\n

Gutes Beispiel:

\n
try\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\n

Tipp: 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.

\n\n

3. Falsche Verwendung von Zeichenketten (String vs StringBuilder)

\n\n

C#-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.

\n\n

Anfängerfehler:

\n
string result = "";\nfor (int i = 0; i < 1000; i++)\n{\n    result += i.ToString(); // Jede Iteration erzeugt eine neue Zeichenkette!\n}\nConsole.WriteLine(result);

Blogs

Buchempfehlungen