Dein C#-Jobinterview: 10 Fragen, die dich erwarten
Von den Grundlagen der C#-Vorteile bis hin zu detaillierten Erklärungen verschiedener Elemente und deren Nutzung: Wir haben die essenziellen Fragen für dein Vorstellungsgespräch rund um die objektorientierte Programmiersprache C# für dich aufbereitet.
In diesem Beitrag präsentieren wir 10 Fragestellungen, die in Bewerbungsverfahren für Development-Positionen häufig vorkommen, inklusive der passenden Antworten. Natürlich existiert eine Vielzahl weiterer spezifischer Themen zu C#. Unser Ziel ist es, dir einen soliden Überblick von Basiswissen bis hin zu Detailfragen zu verschaffen und dich für eine gezielte Vorbereitung auf dein Gespräch zu sensibilisieren.
Frage 1: Was zeichnet C# aus und welche Pluspunkte bietet die Sprache?
C# ist in Kombination mit der Entwicklungsumgebung Visual Studio primär auf Performance getrimmt. Als objektorientierte Sprache überzeugt C# durch eine moderne, intuitive Anwendungsentwicklung, die gleichzeitig enorm flexibel und kraftvoll ist. Viele Developer entscheiden sich daher für C#, wenn sie vor der Wahl stehen, welche Programmiersprache sie lernen sollen.
Die Struktur von C# basiert konsequent auf Klassen und Objekten. Es handelt sich um eine stark typisierte Sprache, die Konzepte wie Abstraktion, Kapselung und Vererbung voll ausschöpft. Primär ist sie darauf ausgelegt, innerhalb des Microsoft-.NET-Ökosystems Höchstleistungen zu erbringen.
Durch diesen Fokus besitzt C# einen spezifischen Aufbau, bei dem die meisten Typen innerhalb der .NET-Strukturen direkt von der Objekt-Klasse erben. Diese Klassen bringen wiederum Methoden, Eigenschaften, Felder und Ereignisse mit sich.
Frage 2: Wie wird der Begriff „Objekt“ in C# definiert?
Um das Objekt-Konzept zu greifen, muss man die grundlegende Logik von C# verstehen. In dieser objektorientierten Welt wird das Fundament durch Klassen gelegt. Eine Klasse gibt die Datenstruktur vor und legt fest, wie Informationen gespeichert, verwaltet oder übertragen werden dürfen. Sie dient somit als Bauplan für alle weiteren Strukturen.
Objekte sind die tatsächlichen Instanzen in C#, die realen Speicherplatz belegen. Als Objekt gelten alle Einheiten, die spezifische Merkmale besitzen oder eine konkrete Aufgabe in der Software übernehmen. Der Typ wird durch die Klasse vorgegeben, wobei Instanzen das Gerüst für die weitere Programmlogik bilden.
Ein Beispiel zur Verdeutlichung: Angenommen, du programmierst eine Anwendung für TV-Geräte. Zuerst definierst du die Basis-Entität, also die Klasse „television“. Für diesen Fernseher legen wir 5 Merkmale fest: Marke, Modell, Farbe, Diagonale und Preis. Diese Merkmale sind die Mitglieder der Klasse. Weitere Mitglieder könnten Methoden oder Events sein, die das Objekt lebendig machen.
Erstellst du nun einen Sony Bravia als konkrete Instanz, füllst du das Objekt mit Werten wie Sony, Bravia, Schwarz, 50 Zoll und 500 €. Damit ist der Sony-Fernseher eine Instanz der Klasse „television“. Wichtig: Damit du auf diese Klasse zugreifen kannst, muss sie als „public“ definiert sein.
Frage 3: Was ist der Unterschied zwischen Managed und Unmanaged Code in C#?
Managed Code
Als Managed Code bezeichnet man in C# jenen Code, der innerhalb des .NET-Frameworks erstellt wurde. Er wird direkt von der Common Language Runtime (CLR) ausgeführt. Die Runtime kümmert sich um den gesamten Lebenszyklus – von der Objekterstellung über die Speicherverwaltung bis hin zur Bereinigung.
Unmanaged Code
Code, der außerhalb des .NET-Frameworks entsteht, wird als Unmanaged Code deklariert. Dazu zählen Anwendungen, die nicht unter der direkten Aufsicht der CLR laufen.
Das .NET-Framework ermöglicht es jedoch, Unmanaged Code in Managed Code zu transformieren (und umgekehrt). Das ist besonders wertvoll, da so auch für diesen Code die Vorteile der automatischen Speicherverwaltung und Ausführungskontrolle genutzt werden können.
Frage 4: Worin unterscheiden sich struct und class?
In C# stehen die Begriffe Klasse (class) und Struktur (struct) für benutzerdefinierte Datentypen, die sich in wesentlichen Punkten unterscheiden:
Struktur (struct)
-
Ist ein Werttyp und erbt in C# implizit von System.ValueType.
-
Kann nicht von anderen Typen abgeleitet werden.
-
Wird meist für kompakte Datenmengen genutzt.
-
Kann nicht abstrakt sein und benötigt eine direkte Implementierung.
-
Ein Standardkonstruktor kann nicht manuell zugewiesen werden.
-
Die Nutzung des
new-Keywords ist beim Erstellen nicht zwingend nötig.
Klasse (class)
- Ist ein Referenztyp und erbt implizit von System.Object.
- Unterstützt Vererbung und kann von anderen Klassen abgeleitet werden.
- Eignet sich ideal für komplexe Strukturen und große Datenmengen.
- Kann abstrakt definiert werden, was eine direkte Instanziierung verhindert.
- Erlaubt die Definition eines individuellen Standardkonstruktors.
Frage 5: Was unterscheidet eine Schnittstelle von einer abstrakten Klasse?
Schnittstellen (interfaces) und abstrakte Klassen (abstract classes) dienen beide als Code-Verträge – sie definieren etwa Vorbedingungen für abgeleitete Klassen. Dennoch gibt es markante Unterschiede in ihrer Arbeitsweise.
Mit solchen Verträgen legst du fest, welche Anforderungen beim Aufruf einer Methode oder Eigenschaft erfüllt sein müssen.
Beim Thema Vererbung zeigt sich: Abstrakte Klassen dürfen sowohl fertigen Code als auch abstrakte Methoden enthalten. Bei Schnittstellen hingegen müssen alle Methoden abstrakt sein. Abstrakte Klassen benötigen zur Kennzeichnung das Keyword abstract.
Da C# keine Mehrfachvererbung bei Klassen erlaubt, kann eine Klasse nur von maximal einer abstrakten Klasse erben. Im Gegensatz dazu kannst du für eine Klasse beliebig viele Schnittstellen implementieren.
Zudem können abstrakte Klassen Konstruktoren besitzen, die von Subklassen genutzt werden. Schnittstellen bieten dies nicht, da sie keine Instanzen darstellen und somit nicht initialisiert werden können.
Frage 6: Was sind Eigenschaften (properties) in C#?
Eigenschaften sind Klassenelemente, über die du den Wert eines privaten Feldes auslesen, ändern oder berechnen kannst. Sie fungieren als kontrollierter Zugang zur öffentlichen Schnittstelle und erlauben es, Daten innerhalb einer Klasse sicher zu manipulieren.
In der objektorientierten Programmierung sind Eigenschaften ein Schlüsselelement, um einen sauberen Datenzugriff in Applikationen zu gewährleisten.
Deklariert werden sie über get- und set-Accessoren. Während der get-Accessor den Wert liefert, schreibt der set-Accessor diesen. Je nachdem, ob ein Feld nur lesbar oder auch beschreibbar sein soll, nutzt du einen oder beide Accessoren.
Frage 7: Was bedeuten Boxing und Unboxing?
Diese Begriffe beschreiben die Typumwandlung in C#.
- Boxing ist die Umwandlung eines Werttyps in einen Referenztyp (z. B. von int zu object). Dies geschieht implizit.
- Unboxing ist der umgekehrte Weg: Ein Referenztyp wird zurück in einen Werttyp verwandelt. Dies funktioniert nur, wenn der Zieltyp exakt dem ursprünglichen Typ entspricht (z. B. von object zurück zu int).
Frage 8: Was ist ein Aufzählungstyp (enum) und wofür wird er genutzt?
Ein Enum ist ein Werttyp, der eine Gruppe logisch zusammengehöriger Konstanten bündelt (Enumeratorliste). Enums sind benutzerdefinierte Datentypen, die zur Deklaration das Keyword enum nutzen.
Sie kommen immer dann zum Einsatz, wenn du im .NET-Framework mit numerischen Konstanten arbeitest. Jedes Mitglied eines Enums besitzt einen festen numerischen Wert. Vorteil: Ein Enum lässt sich im Code als lesbarer Text (String) anzeigen, wird intern aber effizient als Zahl verarbeitet.
Standardmäßig basiert ein Enum auf dem Typ int, wobei die Zählung bei 0 beginnt. Du kannst diese Werte jedoch auch manuell festlegen (z. B. 10 für „An“, 20 für „Aus“).
Frage 9: Dispose vs. Finalize: Wo liegt der Unterschied?
In C# dienen beide Wege dazu, Ressourcen wieder freizugeben.
Die Dispose-Methode räumt Unmanaged Resources auf, wie etwa Datenbankverbindungen, die nicht automatisch von .NET verwaltet werden. Sie wird in Klassen via IDisposable-Interface implementiert.
Der Aufruf erfolgt explizit durch den Code, sobald Ressourcen nicht mehr gebraucht werden. Besonders elegant klappt das mit der using-Anweisung, die Dispose automatisch triggert, sobald das Objekt den Gültigkeitsbereich verlässt.
Die Finalize-Methode hingegen wird vom Garbage Collector aufgerufen, kurz bevor ein Objekt endgültig gelöscht wird, um letzte Aufräumarbeiten zu erledigen. Sie wird durch das Überschreiben der Object.Finalize-Methode implementiert.
Frage 10: Welchen Nutzen bringen Erweiterungsmethoden?
Mit Erweiterungsmethoden kannst du die Funktionalität bestehender Typen ausbauen, ohne deren Quellcode anzupassen oder eine neue Klasse abzuleiten. So fügst du Klassen, Interfaces oder Enums nachträglich Methoden hinzu.
Diese Methoden werden in statischen Klassen definiert. Der erste Parameter erhält das Keyword this, welches den zu erweiternden Typ markiert. Dadurch lässt sich die Methode später so einfach aufrufen, als wäre sie von Anfang an Teil des Typs gewesen.
Tipp: C#-Fragen können im Gespräch stark variieren
Wer dir im Vorstellungsgespräch gegenübersitzt, ist ein guter Indikator für die Tiefe der Fragen. Personalverantwortliche konzentrieren sich oft auf das große Ganze, da ihnen meist das tiefe Fachwissen für Detaildiskussionen über C#-Objektstrukturen fehlt.
Triffst du jedoch auf den Lead Software Architect oder erfahrene Web-Developer, wird es fachlich. Besonders bei Positionen für Fortgeschrittene sind spezifische Fragen zum Fachbereich Standard. Deine potenziellen Kolleg:innen möchten schließlich sicherstellen, dass du im Arbeitsalltag eine echte Stütze für das Team bist.