- HTML 87.8%
- C# 11.7%
- Python 0.5%
|
|
||
|---|---|---|
| .claude | ||
| .forgejo/workflows | ||
| .vscode | ||
| archive | ||
| articles | ||
| books | ||
| build | ||
| demos | ||
| docs | ||
| exercises | ||
| scratch | ||
| solutions | ||
| src | ||
| tutorials | ||
| .gitignore | ||
| BUILD.md | ||
| GEMINI.md | ||
| README.md | ||
Advanced C# Programming — Trainer Guide
If you are delivering this course on Monday, start here.
Repo geography
| Path | What it is |
|---|---|
src/slides/ |
Marp slide source — one folder per module, one .md file per folder |
src/exercises/ |
Exercise specs — one Markdown file per module |
src/site/ |
Course website copy and official syllabus reference |
build/ |
Build scripts (build.py, lint-slides.py, Node config) |
demos/ |
Demo console projects across 9 module solutions |
solutions/ |
Reference solutions — one project per exercise module |
build/dist/ |
Temporary build artifacts (combined.md, student.zip) — gitignored |
archive/ |
Historical authoring docs — not part of the active workflow |
Student deliverable
Attendees receive three things:
- Slides PDF — generated at repo root
- Exercises PDF — generated at repo root
- Demo source code — zip of
demos/
Everything else (exercise reference solutions in solutions/, build scripts,
source Markdown, archived docs) is trainer-internal.
Build commands
python build/build.py # slides PDF
python build/build.py --exercises # exercises PDF
python build/build.py --check-builds # also runs dotnet build over all .slnx solutions
python build/build.py --check-builds --skip-builds # opt-out if you just need PDFs fast
python build/lint-slides.py # slide content lint (run before build)
See BUILD.md for full pipeline detail, flag reference, and troubleshooting.
Module navigation
| # | Topic | Slides | Demos | Exercise spec | Reference solution |
|---|---|---|---|---|---|
| 1 | Advanced C# Features | src/slides/01-advanced-csharp-features/ |
demos/M01.AdvancedFeatures/ |
src/exercises/01-advanced-csharp-features.md |
solutions/M01.AdvancedFeatures/ |
| 2 | Delegates and Lambdas | src/slides/02-delegates-and-lambdas/ |
demos/M02.DelegatesAndLambdas/ |
src/exercises/02-delegates-and-lambdas.md |
solutions/M02.DelegatesAndLambdas/ |
| 3 | Generics | src/slides/03-generics/ |
demos/M03.Generics/ |
src/exercises/03-generics.md |
solutions/M03.Generics/ |
| 4 | Functional Programming | src/slides/04-functional-programming/ |
demos/M04.FunctionalProgramming/ |
src/exercises/04-functional-programming.md |
solutions/M04.FunctionalProgramming/ |
| 5 | Asynchronous Programming | src/slides/05-asynchronous-programming/ |
demos/M05.AsynchronousProgramming/ |
src/exercises/05-asynchronous-programming.md |
solutions/M05.AsynchronousProgramming/ |
| 6 | Dependency Injection | src/slides/06-dependency-injection/ |
demos/M06.DependencyInjection/ |
src/exercises/06-dependency-injection.md |
solutions/M06.DependencyInjection/ |
| 7 | Reflection & Metaprogramming | src/slides/07-reflection-and-metaprogramming/ |
demos/M07.ReflectionAndMetaprogramming/ |
src/exercises/07-reflection-and-metaprogramming.md |
solutions/M07.ReflectionAndMetaprogramming/ |
| 8 | Memory Management | src/slides/08-memory-management/ |
demos/M08.MemoryManagement/ |
src/exercises/08-memory-management.md |
solutions/M08.MemoryManagement/ |
| 9 | Advanced Topics | src/slides/09-advanced-topics/ |
demos/M09.AdvancedTopics/ |
src/exercises/09-advanced-topics.md |
solutions/M09.AdvancedTopics/ |
| 10 | Capstone | — | — | src/exercises/10-capstone.md |
solutions/M10.Capstone/ |
Suggested four-day delivery flow
| Day | Sessions | Modules |
|---|---|---|
| 1 | AM + PM | 1 — Advanced C# Features, 2 — Delegates and Lambdas |
| 2 | AM + PM | 3 — Generics, 4 — Functional Programming |
| 3 | AM + PM | 5 — Asynchronous Programming, 6 — Dependency Injection |
| 4 AM | AM | 7 — Dynamic Programming, 8 — Memory Management, 9 — Advanced Topics |
| 4 PM | PM | Exercise 10 — Capstone |
This is a starting heuristic; calibrate for room pace. Day 4 AM covers three modules at a faster pace; if the group is slower, move Module 9 to a fifth half-day.
Audience profile
Working enterprise developers — typically at banks, ISPs, or large internal-tooling teams — who have been writing C# for years on older runtimes (.NET Framework, .NET Core 2/3). They are comfortable with the language basics. They want a guided tour of what modern C# and .NET offer: practical trade-offs, production pitfalls, and the kind of judgment that comes from seeing the ecosystem whole, not trivia about compiler internals.
Approach the room as seasoned colleagues learning a new area, not as students learning a first language.
Course design notes
COURSE_DELIVERY_CRITIQUE.md documents known delivery trade-offs, coverage gaps,
and design rationale from the latest review pass. Read it before first delivery.
src/slides/CONTENT_CRITIQUE.md documents per-slide content notes and edge cases
the slides do not fully cover — useful for fielding advanced questions.
Coding conventions (demos and reference solutions)
Follow these exactly or builds will break:
- No em-dashes anywhere in code or comments — use semicolons or rewrite as full sentences.
- Top-level statements in
Program.cs. Supporting types (classes, records, interfaces, delegates, enums, attributes) must appear after all top-level statements in the file. - Each demo runs straight through and exits — no interactive menu.
- Section headers use
Console.WriteLine("--- Section Name ---"); - Solution files use
.slnxformat (dotnet new slnon .NET 9+ produces this). Do not force.sln. - Every project:
<Nullable>enable</Nullable>and<ImplicitUsings>enable</ImplicitUsings>. - Target framework:
net10.0.
Standard csproj template:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
Slide authoring conventions
-
Tone: calm, professional engineering tone. No exaggerated language ("seamlessly", "harnessing", "leveraging", "crucially"). Run
python lint-slides.pybefore every build. -
Fast Refresher Pattern: for foundational topics, use 1-2 slides as a quick refresher before moving into advanced trade-offs and design decisions.
-
Version badges: use sparingly to orient developers on feature/runtime requirements. Place inline at the end of a header or bullet point:
# My Topic <span class="badge-row"><span class="version-badge">C# 12</span></span>Available variants:
version-badge(C#),dotnet,runtime,caution(Preview). Badges placed in headers are automatically stripped from PDF bookmarks. -
Course Schedule slides: source slides named
# Course Schedulein module files are ignored bybuild.py— they are generated dynamically from module titles. -
Separator: use
---to separate slides within a module file. -
List Markers: Use
-(dash) for standard lists. Avoid*(asterisk) unless you explicitly want Fragmented Lists (bullets that appear one-click-at-a-time). The entire codebase was converted to-to ensure a consistent, non-animated delivery style.
Trainer workflow (Pro)
For a better delivery experience, use the interactive server:
python build/build.py --serve
This launches a local web server with all modules combined. Open the URL in your browser and press P to enter Presenter Mode, which gives you synced speaker notes and a timer.