P
prepair.app
Interview starten →
EnglishУкраїнськаРусскийDeutsch
🟣

.NET-Interviewfragen

.NET-Interviews bewegen sich zwischen C# als Sprache und der Runtime darunter — der CLR, dem GC, wie async/await tatsächlich funktioniert — bevor sie bei ASP.NET Core und Entity Framework Core landen, wo die meisten praxisnahen Fragen liegen. Hier sind die am häufigsten gestellten Fragen, jeweils mit einer Musterantwort.

Junior · keine Erfahrung / unter 1 JahrMiddle · 2–4 Jahre ErfahrungSenior · 5+ Jahre Erfahrung

Worum es geht

C#-Typen, LINQ und nullable reference types
Async/await und das Task-Modell
CLR, JIT und Garbage Collection
ASP.NET Core: Middleware und Dependency Injection
Entity Framework Core und Query-Performance
Testing mit xUnit/Moq, Docker und Cloud-Deployment

9 echte Fragen mit Antworten

Zu jeder Frage gibt es eine Musterantwort, mit der du deine eigene vergleichen kannst.

1

Was ist der Unterschied zwischen Value Types und Reference Types in C#?

Antwort

Ein Value Type (struct, int, bool, enum) hält seine Daten direkt und wird bei einer Zuweisung kopiert; ein Reference Type (class, string, Arrays) hält einen Zeiger auf Daten im Heap, und bei einer Zuweisung wird der Zeiger kopiert, nicht das Objekt. Wird eine Struct an eine Methode übergeben, die sie verändert, arbeitet die Methode stillschweigend mit einer Kopie, außer du übergibst sie per ref. Eine Struct, die in einem Feld einer Klasse steckt, liegt zusammen mit ihr im Heap, nicht auf dem Stack.

2

Was sind Boxing und Unboxing, und warum ist das performancerelevant?

Antwort

Boxing verpackt einen Value Type in ein Objekt im Heap, damit er als object behandelt werden kann — etwa wenn ein int dort übergeben wird, wo object erwartet wird, oder in eine nicht-generische ArrayList. Unboxing castet ihn zurück und kopiert den Wert heraus. Jede Box ist eine Heap-Allokation und ein GC-Kandidat, weshalb eine Schleife, die Millionen von Ints boxt, echten Collection-Druck erzeugt, den Generics vollständig vermeiden.

3

Welches Problem lösen Nullable Reference Types?

Antwort

Vor C# 8 sahen string name und ein Wert, der null sein konnte, identisch aus, sodass der Compiler nicht warnen konnte, dass eine Methode, die null zurückgibt, drei Aufrufe später hochgeht. Mit aktivierten Nullable Reference Types bedeutet string „niemals null" und string? „kann null sein", und der Compiler warnt, wenn du einen ?-Typ ohne Prüfung dereferenzierst. Zur Laufzeit erzwingt das nichts, aber es macht aus den meisten Null-Reference-Bugs Compile-Zeit-Warnungen statt einer NullReferenceException um zwei Uhr nachts.

4

Was bedeutet es, dass die Ausführung einer LINQ-Query verzögert (deferred) ist?

Antwort

var query = users.Where(u => u.Active) fasst die Daten nicht an — es wird eine Pipeline gebaut, die läuft, sobald du sie mit foreach, .ToList(), .Count() oder Ähnlichem enumerierst. Deshalb kann dieselbe Query-Variable unterschiedliche Ergebnisse liefern, wenn sich die zugrunde liegende Collection zwischen Erstellung und Enumeration ändert, und deshalb killt ein zu früher .ToList()-Aufruf weitere Filterung, während ein zu später Aufruf bei einem IQueryable bedeutet, dass die Query bei jeder Enumeration erneut gegen die Datenbank läuft.

5

Was passiert tatsächlich, wenn du einen `Task` mit `await` erwartest?

Antwort

Der Compiler baut die Methode in eine State Machine um: Code bis zum await läuft synchron, und wenn der erwartete Task noch nicht fertig ist, gibt die Methode die Kontrolle sofort an den Aufrufer zurück und gibt den Thread frei. Wenn der Task fertig ist, wird die Fortsetzung fortgesetzt — standardmäßig im erfassten SynchronizationContext bei UI-Apps, weshalb ConfigureAwait(false) in Library-Code Deadlocks vermeidet. async bedeutet nicht „läuft auf einem anderen Thread", sondern „blockiert den Thread nicht während des Wartens".

6

Was sind GC-Generationen, und warum nutzt die Runtime sie?

Antwort

Die CLR gruppiert Objekte in Generation 0, 1 und 2, basierend auf der Beobachtung, dass die meisten Objekte jung sterben — ein request-scoped DTO ist innerhalb von Millisekunden Müll, ein gecachtes Config-Objekt überlebt die gesamte App-Laufzeit. Gen-0-Collections sind billig und häufig; wer überlebt, wird nach Gen 1 befördert, dann Gen 2, und Gen-2-Collections scannen den gesamten lebenden Heap und sind teuer. Objekte ab 85.000 Bytes gehen direkt in den Large Object Heap, der zusammen mit Gen 2 gesammelt wird und standardmäßig nicht kompaktiert.

7

Beschreibe die ASP.NET-Core-Middleware-Pipeline.

Antwort

Jeder Request durchläuft die in Program.cs registrierte Middleware in der Reihenfolge, in der sie hinzugefügt wurde — typischerweise Exception Handling, HTTPS-Redirect, Routing, Authentication, Authorization, dann der Endpoint. Jede Middleware kann vor dem Aufruf von next() agieren, danach, oder beides, und kann die Kette abbrechen, indem sie next() gar nicht aufruft — so lehnt Authentication einen Request ab, bevor er den Controller erreicht. Die Reihenfolge ist nicht kosmetisch: Authorization vor Routing bedeutet, dass es noch keinen gematchten Endpoint gibt, gegen den Policies geprüft werden könnten, und das wirft eine Exception.

8

Wann verursacht Entity Framework Core ein N+1-Problem, und wie behebst du es?

Antwort

Eine Liste von Bestellungen zu laden und dann innerhalb eines foreach ohne Eager Loading auf order.Customer.Name zuzugreifen, feuert eine Query pro Bestellung ab — dasselbe N+1-Muster wie bei jedem ORM. Include(o => o.Customer) behebt das mit einem JOIN, oder AsSplitQuery(), wenn ein Join Zeilen über mehrere included Collections hinweg vervielfachen würde. Change Tracking ist eine verwandte Kostenstelle: EF Core hält für jede getrackte Entity einen Snapshot, um Änderungen bei SaveChanges() zu erkennen, was für eine reine Leseliste verschwendete Arbeit ist — Lesepfade sollten daher AsNoTracking() nutzen.

9

Was ist der Unterschied zwischen den eingebauten DI-Lifetimes — Transient, Scoped und Singleton?

Antwort

Transient erzeugt bei jeder Anfrage eine neue Instanz. Scoped erzeugt eine Instanz pro Request und nutzt sie für den Rest dieses Requests weiter. Singleton erzeugt eine Instanz für die gesamte Lebensdauer der Anwendung. Der klassische Bug ist, einen Scoped-Service — etwa einen DbContext — in einen Singleton zu injizieren: Der Singleton hält die Scoped-Instanz des ersten Requests für immer fest, was bei späterer Nutzung entweder wirft oder still Zustand über nicht zusammenhängende Requests hinweg teilt.

🦎

Antworten lesen reicht nicht

Im echten Interview sprichst du unter Druck. Cam stellt genau diese Fragen, bewertet jede Antwort und zeigt dir genau, was du verbessern musst.

.NET Backend Developer-Interview üben →
Kostenlos · 3 Interviews im Monat

Lesenswert

Alle Artikel →

Weitere Spezialisierungen

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP-Backend🦫Go-Backend🟢Node.js-Backend💎Ruby on Rails🔷C++🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)📱React Native Developer⚙️DevOps / SRE🗄️Data Engineer🧠AI/ML Engineer📊Data Scientist📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing🧑‍💼HR / Recruiter🤝Sales / Account Manager🎧Technical Support Engineer