C#/.NET Backend-Interviewfragen mit Antworten

Milad Bonakdar
Autor
Bereiten Sie sich auf C#/.NET-Backend-Interviews vor: ASP.NET Core, EF Core, async Code, DI, REST APIs, Testing und Architektur.
Einführung
Für ein C#/.NET-Backend-Interview sollten Sie erklären können, wie Sie APIs mit ASP.NET Core bauen, Datenzugriffe mit EF Core effizient halten, async Code ohne blockierende Threads einsetzen und Services mit Dependency Injection strukturieren. Gute Antworten verbinden das Konzept mit einem echten Backend-Trade-off: Performance, Zuverlässigkeit, Testbarkeit oder Wartbarkeit.
Nutzen Sie diesen Leitfaden als praktische Checkliste. Lesen Sie die Kurzantworten und üben Sie dann, jede Antwort mit einem konkreten Beispiel aus einem Projekt, Praktikum, Coding-Test oder Produktionsproblem zu verbinden.
C#-Sprachgrundlagen
1. Was ist der Unterschied zwischen struct und class in C#?
Antwort:
- Class (Klasse): Ein Referenztyp (im Heap alloziert). Wenn Sie ein Klassenobjekt an eine Methode übergeben, übergeben Sie eine Referenz auf die Speicheradresse. Änderungen innerhalb der Methode wirken sich auf das Originalobjekt aus. Unterstützt Vererbung.
- Struct (Struktur): Ein Werttyp (im Stack alloziert). Wenn Sie eine Struktur übergeben, wird eine Kopie der Daten übergeben. Änderungen innerhalb der Methode wirken sich nicht auf die Originalstruktur aus. Unterstützt keine Vererbung (kann aber Schnittstellen implementieren).
- Verwendung: Verwenden Sie
structfür kleine, unveränderliche Datenstrukturen, die einen einzelnen Wert darstellen (wiePoint,Color). Verwenden Sieclassfür die meisten anderen Objekte.
Seltenheit: Häufig Schwierigkeit: Leicht
2. Erklären Sie async und await. Wie hilft das bei der Skalierbarkeit?
Antwort:
async und await lassen eine Methode pausieren, während eine I/O-Operation läuft, und fortsetzen, wenn der Task abgeschlossen ist.
- Mechanismus:
awaiterstellt keinen neuen Thread. Bei Datenbank-, Datei- oder Netzwerkaufrufen wird der Request-Thread freigegeben. - Skalierbarkeit: Das verbessert den Durchsatz bei I/O-lastigen ASP.NET-Core-Endpunkten, macht CPU-lastige Arbeit aber nicht automatisch schneller.
- Interview-Tipp: Nennen Sie
CancellationTokenund EF-Core-Methoden wieToListAsyncoderSaveChangesAsync, wenn es um Datenbank-I/O geht.
Seltenheit: Sehr häufig Schwierigkeit: Mittel
3. Was ist Dependency Injection (DI) und wie wird sie in .NET implementiert?
Antwort: Dependency Injection (Abhängigkeitsinjektion) ist ein Entwurfsmuster, bei dem die Abhängigkeiten einer Klasse von außen bereitgestellt werden, anstatt intern erstellt zu werden.
- In .NET: ASP.NET Core verfügt über einen integrierten DI-Container. Sie registrieren Dienste in
Program.cs(oderStartup.csin älteren Versionen) und injizieren sie über die Konstruktorinjektion. - Lebensdauern:
- Transient: Wird jedes Mal erstellt, wenn sie angefordert werden.
- Scoped: Wird einmal pro Clientanforderung (HTTP-Anforderung) erstellt.
- Singleton: Wird beim ersten Mal erstellt, wenn sie angefordert werden, und von allen nachfolgenden Anforderungen gemeinsam genutzt.
Seltenheit: Sehr häufig Schwierigkeit: Mittel
4. Was ist der Unterschied zwischen IEnumerable<T> und IQueryable<T>?
Antwort:
IEnumerable<T>: Führt die Abfrage im Speicher aus. Bei Verwendung mit einer Datenbank (EF Core) werden alle Daten vom Server in den Client-Speicher abgerufen und dann gefiltert. Gut für LINQ to Objects.IQueryable<T>: Führt die Abfrage remote aus (z. B. auf dem SQL-Server). Es erstellt einen Ausdrucksbaum, der in eine SQL-Abfrage übersetzt wird. Die Filterung erfolgt auf der Datenbankseite, was für große Datensätze viel effizienter ist.
Seltenheit: Häufig Schwierigkeit: Mittel
5. Was sind Erweiterungsmethoden (Extension Methods)?
Antwort: Erweiterungsmethoden ermöglichen es Ihnen, vorhandenen Typen Methoden "hinzuzufügen", ohne einen neuen abgeleiteten Typ zu erstellen, neu zu kompilieren oder den ursprünglichen Typ anderweitig zu ändern.
- Syntax: Definiert als statische Methoden in einer statischen Klasse. Der erste Parameter gibt an, auf welchen Typ die Methode angewendet wird, vorangestellt durch das Schlüsselwort
this. - Beispiel: Hinzufügen einer
WordCount()-Methode zurstring-Klasse.
Seltenheit: Häufig Schwierigkeit: Leicht
ASP.NET Core & Architektur
6. Was ist Middleware in ASP.NET Core?
Antwort: Middleware sind Softwarekomponenten, die zu einer Anwendungspipeline zusammengesetzt werden, um Anforderungen und Antworten zu verarbeiten.
- Pipeline: Jede Komponente wählt, ob sie die Anforderung an die nächste Komponente in der Pipeline weiterleitet, und kann vor und nach dem Aufruf der nächsten Komponente Arbeit verrichten.
- Beispiele: Authentifizierung, Autorisierung, Protokollierung, Ausnahmebehandlung, Bereitstellung statischer Dateien.
- Reihenfolge ist wichtig: Die Reihenfolge, in der Middleware in
Program.cshinzugefügt wird, definiert die Ausführungsreihenfolge.
Seltenheit: Sehr häufig Schwierigkeit: Mittel
7. Erklären Sie den Unterschied zwischen .NET Core und .NET Framework.
Antwort:
- .NET Framework: Die ursprüngliche, Windows-einzige Implementierung. Ausgereift, aber an Windows gebunden.
- .NET Core / modernes .NET: Die plattformübergreifende, Open-Source-Nachfolgelinie. Seit .NET 5 heißt die Plattform meist einfach
.NET; aktuelle Releases umfassen .NET 10 als LTS-Version mit C# 14. - Hauptunterschiede: Modernes .NET ist die Standardwahl für neue Backend-APIs, weil es Linux-Container, parallele Versionen, aktuelle ASP.NET-Core-Funktionen und aktive Runtime-Verbesserungen unterstützt.
Seltenheit: Häufig Schwierigkeit: Leicht
8. Was ist Kestrel?
Antwort: Kestrel ist ein plattformübergreifender, Open-Source-, ereignisgesteuerter Webserver, der standardmäßig in ASP.NET Core-Vorlagen enthalten ist.
- Rolle: Er überwacht HTTP-Anforderungen und leitet sie an die Anwendung weiter.
- Verwendung: Er kann eigenständig (Edge-Server) oder hinter einem Reverse-Proxy wie IIS, Nginx oder Apache laufen. Die Verwendung eines Reverse-Proxys wird für die Produktion empfohlen, um Sicherheit, Lastverteilung und SSL-Terminierung zu gewährleisten.
Seltenheit: Mittel Schwierigkeit: Mittel
9. Wie behandeln Sie globale Ausnahmebehandlung in ASP.NET Core?
Antwort: Anstatt Try-Catch-Blöcke in jedem Controller zu verwenden, sollten Sie Middleware für die globale Ausnahmebehandlung verwenden.
UseExceptionHandler: Integrierte Middleware, die Ausnahmen abfängt, protokolliert und die Anforderung in einer alternativen Pipeline erneut ausführt (normalerweise auf eine Fehlerseite oder API-Antwort verweisend).- Benutzerdefinierte Middleware: Sie können benutzerdefinierte Middleware schreiben, um Ausnahmen abzufangen und eine standardisierte JSON-Fehlerantwort zurückzugeben (z. B.
ProblemDetails).
Seltenheit: Häufig Schwierigkeit: Mittel
Datenbank & Entity Framework
10. Was ist Entity Framework Core (EF Core)? Code-First vs. Database-First?
Antwort: EF Core ist ein Object-Relational Mapper (ORM) für .NET. Es ermöglicht Entwicklern, mit einer Datenbank mithilfe von .NET-Objekten zu arbeiten.
- Code-First: Sie definieren zuerst Ihre Domänenklassen (Entitäten), und EF Core erstellt/aktualisiert das Datenbankschema basierend auf diesen mithilfe von Migrationen. Bevorzugt für neue Projekte.
- Database-First: Sie haben eine vorhandene Datenbank, und EF Core generiert die .NET-Klassen (Scaffolding) basierend auf dem Schema.
Seltenheit: Häufig Schwierigkeit: Leicht
11. Was ist das N+1-Problem in EF Core und wie beheben Sie es?
Antwort: Das N+1-Problem tritt auf, wenn Sie eine Liste von Entitäten abrufen und dann in einer Schleife für jedes Element eine verknüpfte Entität laden, wodurch viele zusätzliche Datenbankabfragen entstehen.
- Behebung: Laden Sie verknüpfte Daten bewusst mit
Include, gefilterten Includes, Projektionen oder explizitem Laden. Lazy Loading sollte in kritischen Pfaden vermieden werden. - Beispiel:
await context.Orders.Include(o => o.Customer).ToListAsync(); - Trade-off: Bei mehreren Collection-Navigationen können Split Queries oder Projektionen helfen, unnötige Daten und Cartesian Explosion zu vermeiden.
Seltenheit: Sehr häufig Schwierigkeit: Mittel
12. Erklären Sie das Repository Pattern. Warum sollte man es mit EF Core verwenden?
Antwort: Das Repository Pattern vermittelt zwischen der Domänen- und der Datenmapping-Schicht, indem es eine sammlungsähnliche Schnittstelle für den Zugriff auf Domänenobjekte verwendet.
- Vorteile: Entkoppelt die Anwendung von der spezifischen Datenzugriffstechnologie (EF Core), erleichtert Unit-Tests (kann das Repository mocken) und zentralisiert die Datenzugriffslogik.
- Nachteile/Debatte: Der
DbContextvon EF Core ist bereits eine Implementierung des Repository/Unit of Work-Patterns. Das Hinzufügen einer weiteren Schicht kann manchmal redundant sein ("Abstraktion über Abstraktion").
Seltenheit: Häufig Schwierigkeit: Schwer
REST APIs & Web Services
13. Was sind die HTTP-Verben und ihre typische Verwendung?
Antwort:
- GET: Eine Ressource abrufen. Sicher und idempotent.
- POST: Eine neue Ressource erstellen. Nicht idempotent.
- PUT: Eine vorhandene Ressource aktualisieren/ersetzen. Idempotent.
- PATCH: Eine Ressource teilweise aktualisieren. Nicht unbedingt idempotent (aber normalerweise ist es das).
- DELETE: Eine Ressource entfernen. Idempotent.
Seltenheit: Häufig Schwierigkeit: Leicht
14. Was ist der Unterschied zwischen 401 Unauthorized und 403 Forbidden?
Antwort:
- 401 Unauthorized: Der Benutzer ist nicht authentifiziert. Der Client sollte sich anmelden und es erneut versuchen. "Ich weiß nicht, wer Sie sind."
- 403 Forbidden: Der Benutzer ist authentifiziert, hat aber keine Berechtigung, auf die Ressource zuzugreifen. "Ich weiß, wer Sie sind, aber Sie können das nicht tun."
Seltenheit: Häufig Schwierigkeit: Leicht
Testen & Best Practices
15. Was ist der Unterschied zwischen Unit-Tests und Integrationstests?
Antwort:
- Unit-Tests: Testen eine kleine Codeeinheit (normalerweise eine Methode) isoliert. Abhängigkeiten werden gemockt (mit Tools wie Moq). Schnell und zuverlässig.
- Integrationstests: Testen, wie verschiedene Teile der Anwendung zusammenarbeiten (z. B. API-Endpunkt + Datenbank). Langsamer, aber überprüfen das tatsächliche Systemverhalten.
Seltenheit: Häufig Schwierigkeit: Leicht
16. Wie mocken Sie Abhängigkeiten in Unit-Tests?
Antwort: Mocking-Frameworks wie Moq oder NSubstitute werden verwendet, um gefälschte Implementierungen von Schnittstellen zu erstellen.
- Zweck: Die zu testende Klasse zu isolieren. Wenn Sie beispielsweise einen
UserServicetesten, mocken Sie dasIUserRepository, damit Sie nicht auf die echte Datenbank zugreifen. - Beispiel (Moq):
Seltenheit: Häufig Schwierigkeit: Mittel
17. Was sind SOLID-Prinzipien? Nennen Sie ein Beispiel.
Antwort: SOLID ist ein Akronym für 5 Designprinzipien, um Software verständlicher, flexibler und wartbarer zu machen.
- Single Responsibility Principle (SRP) (Prinzip der Einzelverantwortlichkeit)
- Open/Closed Principle (OCP) (Offen/Geschlossen-Prinzip)
- Liskov Substitution Principle (LSP) (Liskovsches Substitutionsprinzip)
- Interface Segregation Principle (ISP) (Schnittstellentrennungsprinzip)
- Dependency Inversion Principle (DIP) (Abhängigkeitsinversionsprinzip)
- Beispiel (DIP): High-Level-Module sollten nicht von Low-Level-Modulen abhängen. Beide sollten von Abstraktionen abhängen. Dies ist die Grundlage für Dependency Injection.
Seltenheit: Häufig Schwierigkeit: Schwer
18. Was ist Boxing und Unboxing? Warum sollte man es vermeiden?
Antwort:
- Boxing (Boxing): Konvertieren eines Werttyps (wie
int) in einen Referenztyp (object). Es allokiert Speicher im Heap. - Unboxing (Unboxing): Konvertieren des Referenztyps zurück in den Werttyp.
- Performance: Beide sind teure Operationen (Speicherallokation, Typprüfung). Generics (
List<T>) helfen, Boxing/Unboxing im Vergleich zu älteren Sammlungen (ArrayList) zu vermeiden.
Seltenheit: Häufig Schwierigkeit: Mittel
19. Was ist die using-Anweisung in C#?
Antwort:
Die using-Anweisung bietet eine bequeme Syntax, die die korrekte Verwendung von IDisposable-Objekten sicherstellt.
- Mechanismus: Sie ruft automatisch die
Dispose()-Methode des Objekts auf, wenn der Block verlassen wird (auch wenn eine Ausnahme auftritt). - Moderne Syntax:
using var file = File.OpenRead("path");(keine Klammern erforderlich, wird am Ende des Gültigkeitsbereichs freigegeben).
Seltenheit: Häufig Schwierigkeit: Leicht
20. Erklären Sie das Konzept der Middleware im Kontext des "Chain of Responsibility"-Musters.
Antwort: ASP.NET Core Middleware ist eine klassische Implementierung des Chain of Responsibility-Musters.
- Muster: Eine Anforderung wird entlang einer Kette von Handlern weitergeleitet. Jeder Handler entscheidet, ob er die Anforderung verarbeitet oder an den nächsten Handler in der Kette weiterleitet.
- Anwendung: In .NET stellt
RequestDelegateden nächsten Handler dar. Middleware-Komponenten werden verkettet, um die Anforderungspipeline zu bilden.
Seltenheit: Selten Schwierigkeit: Schwer


