Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
1h 15m 39s
In Lektion 18 der C#-Applikation von Tim Corey von Anfang bis Ende-Reihe richtet sich der Fokus stark auf die logikgetriebene Entwicklung innerhalb einer C# WinForms (Windows Forms) App. Anders als in den früheren Lektionen, die sich auf die Benutzeroberfläche, WinForms-Steuerelemente und das visuelle Layout mit dem Designer konzentrierten, geht es in dieser Lektion darum, ein System zu schaffen, das korrekt im Hintergrund funktioniert.
Tim erklärt immer wieder, dass hier der eigentliche Entwicklungsaufwand stattfindet. Buttons, Textboxen und allgemeine Steuerelemente sind einfach zu gestalten im Vergleich zum Entwerfen von Logik, die für jedes mögliche Szenario funktionieren muss. Diese Lektion stellt einen Wendepunkt dar, an dem die Anwendung beginnt, sich wie eine echte Windows-Desktopanwendung anzufühlen und nicht nur wie eine Demo.
Die gesamte Lektion wird mit Visual Studio unter Nutzung des .NET Frameworks, einer Klassenbibliothek und eines WinForms-Projekttyps unterrichtet, der zukünftiges Wachstum unterstützt.
Früh in der Lektion macht Tim einen wichtigen Punkt: Nicht sofort mit dem Programmieren beginnen. Er erklärt, dass komplexe Logik niemals in der Code-behind-Datei eines Formulars beginnen sollte. Stattdessen pausiert er die Windows Forms-App, nimmt Papier und Stift und beginnt, die Turnierstruktur visuell zu entwerfen.
Dies ist eine bewusste Abkehr vom Designer, Werkzeugkasten und Eigenschaftsfenster. Tim betont, dass selbst wenn WinForms eine umfassende Suite von UI-Werkzeugen bietet, Logik nicht gezogen oder abgelegt werden kann – sie muss entworfen werden.
Er erwähnt, dass er diese Logik bereits mehrfach umgeschrieben hat, was unterstreicht, dass das Beheben von Fehlern und das Überdenken von Ansätzen ein normaler Bestandteil der Entwicklung ist.
Tim erklärt, was ein Turnier tatsächlich ist aus einer Systemdesignperspektive. Er definiert:
Teams
Begegnungen
Matchup-Einträge
Runden
Freistellungen
Jedes Matchup enthält Matchup-Einträge, und jeder Eintrag weiß vielleicht noch nicht, welches Team er repräsentiert. Diese Idee wird später entscheidend sein, wenn zukünftige Runden implementiert werden.
Tim benutzt ein einfaches Beispiel mit drei Teams, um zu zeigen, warum Turniere Zweierpotenzen erfordern. Aufgrund dessen sind Freistellungen kein besonderes Merkmal – sie sind eine mathematische Notwendigkeit.
Dieser Abschnitt handelt weniger von Code und mehr davon, wie ein Entwickler zu denken, etwas, das Tim wiederholt im Verlauf der Serie betont.
An diesem Punkt wechselt Tim zu Visual Studio, öffnet den Lösungs-Explorer und navigiert in das Datenbankprojekt. Er doppelklickt auf das Tabellendesign und erklärt eine subtile, aber entscheidende Anforderung: zukünftige Runden können die Teams noch nicht kennen.
Aus diesem Grund muss das TeamCompetingId-Feld null-Werte zulassen.
Tim öffnet das Eigenschaftenfenster, erklärt die Sicherheitshinweise von SQL Server und zeigt, wie Sie das Speichern von Änderungen vorübergehend deaktivieren können, die eine Neuanlage der Tabelle erfordern. Er macht darauf aufmerksam, dass dies nur sicher ist, weil die Tabelle leer ist.
Dies ist ein klassisches Beispiel dafür, wie man Entwicklungsgeschwindigkeit, Datenintegrität und reale Einschränkungen ausbalanciert.
Zurück im WinForms-Projekt betont Tim eine Regel, der er seit Beginn des Kurses gefolgt ist: Formulare sollten keine Geschäftslogik enthalten.
Auch wenn WinForms es einfach macht, Logik direkt innerhalb von Button-Klick-Ereignissen zu schreiben, erklärt Tim, dass dies schadet:
Wartbarkeit
Wiederverwendbarkeit
Testbarkeit
zukünftige Plattformkompatibilität
Stattdessen ist die Verantwortung des Formulars auf Folgendes beschränkt:
Sammeln von Eingaben von der Benutzeroberfläche
Methodenaufrufe
Anzeigen von Ergebnissen
Diese Trennung hält die Windows-Desktopanwendung sauber und professionell.
Tim erstellt eine neue Klassenbibliothek und führt eine statische TournamentLogic-Klasse ein. Diese Klasse ist weder UI, noch Datenzugriff, noch ein Modell – sie existiert rein für Implementierungslogik.
Er erklärt, dass diese Designentscheidung es ermöglicht, dieselbe Logik später in folgenden Bereichen wiederzuverwenden:
WPF
ASP.NET
anderen .NET-Desktop- oder Webplattformen
Dieser Moment zeigt stillschweigend, warum WinForms immer noch relevant ist: Wenn richtig verwendet, integriert es sich nahtlos in moderne Architekturen.
Tim implementiert eine Methode, um die Teamreihenfolge zufällig anzuordnen, indem er verwendet:
OrderBy(x => Guid.NewGuid())
Er erkennt an, dass dies nicht kryptographisch perfekt ist, erklärt aber, dass es:
Einfach
Lesbar
Unterstützt
Leicht später zu ersetzen
Dies entspricht einem wiederkehrenden Thema in der Lektion: Korrektheit zuerst erzielen, später optimieren.
Er erklärt auch, warum die ursprüngliche Liste nicht verändert wird, um unbeabsichtigte Nebeneffekte zu vermeiden – eine subtile, aber wichtige Programmiergewohnheit.
Dieser Abschnitt dauert länger als erwartet, und Tim gibt offen zu, warum: Die Logik ist leicht misszuverstehen.
Er zeigt, wie man Runden mit einer Schleife berechnet, anstatt sich auf Formeln zu verlassen, die die Absicht verschleiern. Das Ziel ist Klarheit über Cleverness.
Tim überprüft jeden Fall:
2 Teams → 1 Runde
3 Teams → 2 Runden
4 Teams → 2 Runden
8 Teams → 3 Runden
Er ermutigt die Zuschauer mehrfach, zu pausieren, die Logik isoliert zu testen und zu verifizieren, bevor sie ihr vertrauen.
Statt Math.Pow zu verwenden, schreibt Tim absichtlich manuelle Logik, um die nächste Zweierpotenz zu berechnen. Er erklärt, dass das Vermeiden von Kommas die Fehler reduziert und die Lesbarkeit verbessert.
Dieser Abschnitt zeigt, wie erfahrene Entwickler oft langweiligen, expliziten Code wählen, weil er leichter zu debuggen und zu warten ist.
Die erste Runde ist einzigartig, weil:
Teams bekannt sind
Freistellungen angewendet werden
Eltern-Matchups nicht existieren
Tim führt sorgfältig durch, wie Matchups erstellt werden, wann ein Matchup abgeschlossen ist und wie Freistellungen ein Team automatisch weiterbringen.
Diese Logik wird Schritt für Schritt implementiert, mit häufigen Pausen, um zu erklären, warum jede Entscheidung getroffen wurde.
Spätere Runden werden sehr unterschiedlich erstellt. Teams sind unbekannt, daher werden stattdessen Eltern-Matchups verwendet.
Tim erklärt, wie Matchups aus der vorherigen Runde in die nächste übergehen und einen vollständigen Turnierbaum erstellt wird, bevor ein einziges Spiel gespielt wird.
Dies ist eine der wichtigsten architektonischen Entscheidungen in der gesamten App und ermöglicht:
Punktverfolgung
Gewinnerfortschritt
zukünftige Automatisierung
In den letzten Minuten der Lektion überprüft Tim den gesamten Ablauf:
Teams werden zufällig angeordnet
Runden werden berechnet
Freistellungen werden zugewiesen
Begegnungen werden generiert
Die Turnierstruktur ist komplett
Er betont, dass Fehler zu erwarten sind, die Logik sich im Laufe der Zeit verbessert und professionelle Entwickler ständig früheren Code überarbeiten, um ihn zu verbessern.
Lektion 18 handelt nicht von WinForms-Steuerelementen, Drag-and-Drop-Benutzeroberflächen oder auffälligen Funktionen. Es geht darum, zu denken, zu entwerfen und Code zu schreiben, der im realen Einsatz überlebt.
Am Ende des Videos hat sich die Anwendung von einer einfachen Windows Forms-App zu einem strukturierten, skalierbaren .NET-Desktopprogramm entwickelt – eines, das weit über WinForms hinaus wachsen könnte, falls nötig.
Hier hört das Lernen auf, akademisch zu sein, und beginnt, professionell zu werden.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy