Interviewfragen für Backend-Entwickler (C#/.NET): Der komplette Leitfaden

Milad Bonakdar
Autor
Meistern Sie die C#- und .NET-Backend-Entwicklung mit wichtigen Interviewfragen zu ASP.NET Core, Entity Framework, Dependency Injection und Systemdesign.
Einführung
C# und .NET haben sich erheblich weiterentwickelt und sind zu einem leistungsstarken, plattformübergreifenden Ökosystem für den Aufbau von hochperformanten Backend-Systemen geworden. Mit dem Aufkommen von .NET Core (und jetzt nur noch .NET 5+) ist es eine Top-Wahl für Cloud-native Anwendungen, Microservices und Enterprise-Lösungen.
Dieser Leitfaden behandelt wichtige Interviewfragen für Backend-Entwickler, die sich auf C# und .NET spezialisiert haben. Wir untersuchen die Grundlagen der Sprache, die ASP.NET Core-Architektur, die Datenbankinteraktionen mit Entity Framework und Best Practices, um Ihnen bei der Vorbereitung auf Ihr nächstes Vorstellungsgespräch zu helfen.
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 sind Schlüsselwörter, die für die asynchrone Programmierung verwendet werden.
- Mechanismus: Wenn ein
await-Schlüsselwort gefunden wird, wird die Ausführung der Methode angehalten und der Thread wird an den Threadpool zurückgegeben, um andere Anforderungen zu bearbeiten. Wenn die erwartete Aufgabe abgeschlossen ist, wird die Ausführung fortgesetzt (möglicherweise in einem anderen Thread). - Skalierbarkeit: In einem Webserver (wie Kestrel) sind Threads eine begrenzte Ressource. Wenn ein Thread blockiert und auf I/O (Datenbank, Netzwerk) wartet, kann er keine anderen Anforderungen bearbeiten. Async ermöglicht es dem Server, viel mehr gleichzeitige Anforderungen mit weniger Threads zu bearbeiten, indem er diese während I/O-Operationen nicht blockiert.
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 (jetzt nur noch .NET): Eine plattformübergreifende, Open-Source- und modulare Implementierung. Sie läuft unter Windows, Linux und macOS. Sie ist für hohe Leistung und Cloud-Bereitstellungen optimiert.
- Hauptunterschiede: Plattformübergreifende Unterstützung, Microservices-Architektur-freundlich, höhere Leistung, Side-by-Side-Versionierung.
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 (1 Abfrage) und dann für jedes Element in einer Schleife auf eine zugehörige Entität zugreifen, was N zusätzliche Abfragen verursacht.
- Behebung: Verwenden Sie Eager Loading mit der
.Include()-Methode. Dies generiert einen SQL-JOIN, um die zugehörigen Daten in einer einzigen Abfrage abzurufen. - Beispiel:
context.Orders.Include(o => o.Customer).ToList();
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



