C#: 10 typische Fragen im Jobinterview
Von einfachen Fragen rund um die Vorteile von C# bis zur Erklärung der unterschiedlichen Elemente und ihrer Anwendung fassen wir die wichtigsten Fragen für ein Vorstellungsgespräch rund um die objektbasierte Programmiersprache C# zusammen.
Dieser Artikel stellt zehn Fragen, die häufig in einem Bewerbungsgespräch für eine Stelle in der Entwicklung gestellt werden, und dazu passende Antworten vor. Es gibt natürlich noch eine große Bandbreite an weiteren potenziellen Fragen zu C# und seinen Besonderheiten. Wir wollen einen ersten Überblick von eher einfach gehaltenen Fragen zu recht spezifischen Detailfragen geben und gleichzeitig dafür sensibilisieren, sich gut auf ein Gespräch mit Schwerpunkt zu einer bestimmten Programmiersprache vorzubereiten.
Frage 1: Was sind die Besonderheiten von C# und welche Vorteile bietet die Programmiersprache?
C# ist mit der speziellen Entwicklungsumgebung Visual Studio im Wesentlichen auf Schnelligkeit ausgelegt. Als objektorientierte Programmiersprache punktet C# auch heutzutage mit seiner einfachen und modernen Anwendungsentwicklung, die gleichzeitig sehr vielseitig und leistungfähig ist. Viele Entwicklerinnen und Entwickler entscheiden sich deshalb für C#, wenn Sie sich die Frage stellt, welche Programmiersprache sie lernen sollen.
In der Grundstruktur setzt C# auf ein Konzept, das auf Klassen und Objekten basiert. C# ist eine stark typisierte Sprache, die Funktionen wie Abstraktion, Kapselung und beispielsweise Verberbung bietet. Die Programmiersprache ist im Wesentlichen darauf ausgerichtet, für die Entwicklung innerhalb des Microsoft-.NET-Ökosystems zu fungieren.
Bedingt durch diese spezielle Ausrichtung hat C# einen eigenen Aufbau, bei dem beispielsweise die meisten Typen innerhalb der .NET-Strukturen von der Objekt-Klasse erben. Diese Klassen ziehen dann Methoden, Eigenschaften, Felder und Ereignisse nach sich.
Frage 2: Was versteht man in C# unter der Klassifikation „Objekt“?
Um die Klassifikation des Objekts zu verstehen, muss man die Logik von C# in den Grundlagen verstehen. Als objektorientierte Programmiersprache wird das Fundament in C# durch Klassen aufgebaut. Eine Klasse definiert die Struktur der Daten und legt gleichzeitig fest, wie diese Daten gespeichert werden oder wie eine Verwaltung und/oder Übertragung von Daten in C# erfolgen darf. Sie ist demnach die Vorlage für alle weiteren Strukturen.
Objekte sind reale Elemente innerhalb von C#, die damit verbunden auch reale Werte innerhalb des zur Verfügung stehenden Speichers belegen. Als Objekt lassen sich alle Entitäten zusammenfassen, die entweder mit ganz bestimmten Merkmalen ausgestattet sind oder die innerhalb der Software eine bestimmte Arbeit ausführen. Der Typ eines Objekts wird durch eine Klasse definiert, sogenannte Klasseninstanzen bilden dabei das Gerüst für den weiteren Aufbau.
Um das Konzept von Objekten in C# zu veranschaulichen, ein Beispiel: In einem neugestalteten Programm soll es um einen Fernseher gehen. Als erstes muss dazu eine passende Entität als Startpunkt definiert werden, in diesem Fall handelt es sich dabei um die Entität für den Fernseher, der als Klasse beispielsweise „television“ haben kann. Weiter definieren wir für den Fernseher fünf Eigenschaften: Hersteller, Modell, Farbe, Größe und den Preis. Wie weiter oben beschrieben sind diese Eigenschaften sogenannte Mitglieder einer Klasse. Andere Mitglieder wären zum Beispiel Ereignisse, Methoden oder auch Felder, die daraus ein Objekt bilden.
Um einen Sony Bravia als Instanz eines Fernsehers zu programmieren und dieses Objekt zu erschaffen, können wir als Eigenschaften Sony, Bravia, Schwarz, 50 und 500 angeben. Damit sind die Informationen zu Hersteller, Modell, Farbe, Größe und Preis festgelegt. Der Sony-Fernseher ist somit eine Instanz der Klasse „television“. Soll auf diese Klasse zugegriffen werden können, ist es übrigens wichtig, diese als „öffentlich“ zu definieren und sie nicht privat oder geschützt zu lassen.
Frage 3: Was unterscheidet verwalteten von nicht verwaltetem Code bei C#?
Verwalteter Code
Verwalteter Code ist in C# all jener Code, der mit dem .NET Framework erstellt wurde. Dieser Art Code wird direkt vom Common Language Runtime (CLR) ausgeführt. Die Laufzeit verwaltet den Lebenszyklus des jeweiligen Codes, einschließlich Objekterstellung, Speicherzuweisung und Objektentsorgung.
Nicht verwalteter Code
Der Code, der außerhalb des .NET Frameworks entwickelt wird, wird als nicht verwalteter Code bezeichnet. Darunter fallen alle Anwendungen, die nicht unter der Kontrolle des CLR ausgeführt werden.
Das .NET Framework bietet eine Funktion, mit der nicht verwalteter Code in verwalteten Code umgewandelt werden kann – und umgekehrt. Das ist insbesondere deshalb praktisch, da durch die Funktion innerhalb des Frameworks Objekterstellung, Ausführung und Entsorgung des Codes vorgenommen werden können.
- Flexibel: Hosting, das jedem Website-Traffic standhält
- Verlässlich: Inklusive 24/7-Support und persönlicher Beratung
- Sicher: Kostenloses SSL-Zertifikat, DDoS-Schutz und Backups
Frage 4: Worin besteht der Unterschied zwischen struct und class?
In C# bezeichnen die Begriffe Klasse (class) und Struktur (struct) benutzerdefinierte Datentypen mit einigen grundlegenden Unterschieden:
Struktur
- Als Werttyp in C# erbt die Struktur immer implizit von System.ValueType.
- Strukturen können nicht von anderen Typen abgeleitet werden.
- In der Regel wird eine Struktur für kleinere Datenmengen verwendet.
- Strukturen können nicht abstrakt sein und erfordern daher eine direkte Implementierung.
- Es ist nicht möglich, einer Struktur einen Standardkonstruktor zuzuweisen.
- Das Erstellen eines Objekts unter Verwendung des
new
-Schlüsselworts ist nicht zwingend erforderlich.
Klasse
- Als Verweistyp in C# erbt die Klasse immer implizit von System.Object.
- Klassen können von anderen Klassen abgeleitet werden, was Vererbung ermöglicht.
- In der Regel wird eine Klasse für größere Datenmengen oder komplexere Strukturen verwendet.
- Klassen können abstrakt sein, was bedeutet, dass sie keine direkte Instanziierung zulassen.
- Im Gegensatz zu Strukturen können Klassen einen Standardkonstruktor haben, der bei Bedarf implementiert werden kann.
Bei den unterschiedlichen Programmiersprachen gibt es immer wieder Gemeinsamkeiten, beispielsweise darin, wann Code als schlechter Code betrachtet werden kann. Weiterführende Informationen bieten unter anderem diese Ratgeber in unserem Digital Guide:
Frage 5: Was ist in C# der Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse?
Schnittstellen (interfaces) und abstrakte Klassen (abstract classes) haben gemein, dass sie Codevertragsklassen – z. B. Vorbedingungen oder Objektinvarianten – für abgeleitete Klassen im Code angeben. Trotz dieser Gemeinsamkeit gibt es eine Reihe von Unterschieden, wie die Funktionsweise von Schnittstellen und abstrakten Klassen zeigt.
Mit Codevertragsklassen können Sie Vorbedingungen, Postbedingungen und Objektinvarianten in Ihrem Code angeben. Vorbedingungen sind Anforderungen, die beim Eingeben einer Methode oder einer Eigenschaft erfüllt werden müssen.
In Sachen Vererbung liegen die Unterschiede darin, dass abstrakte Klassen Methoden mit Code wie auch abstrakte Methoden enthalten können und für die Schnittstellen alle Methoden abstrakt sein müssen. Daher benötigen abstrakte Klassen zur Deklarierung das Schlüsselwort abstract
.
Eine Klasse kann von höchstens einer abstrakten Klasse erben, da C# keine mehrfache Vererbung von Klassen unterstützt wird. Dafür können von einer Klasse mehrere Schnittstellen implementiert werden, um eine mehrfache Vererbung von Schnittstellen zu ermöglichen.
Eine abstrakte Klasse kann Konstruktoren haben, die von abgeleiteten Klassen aufgerufen werden können. Schnittstellen können keine Konstruktoren enthalten, da sie keine Instanzen sind und daher nicht initialisiert werden können.
Frage 6: Was sind Eigenschaften (properties) in C#?
Unter Eigenschaften versteht man in C# ein Element einer Klasse, mit dem der Wert eines privat deklarierten Feldes gelesen, beschrieben oder berechnet werden kann. Mit Eigenschaften kann auf öffentliche Schnittstelle zugegriffen werden bzw. lassen die Eigenschaften Änderungen der in einer Klasse gespeicherten Daten zu.
Eigenschaften in C# sind ein elementarer Bestandteil der objektorientierten Programmierung und werden in Anwendungen häufig verwendet, um einen sauberen und sicheren Zugriff auf Klassendaten zu ermöglichen.
Sie werden unter Verwendung der get
- und set
-Accessoren deklariert, die das Verhalten zum Lesen oder Setzen des Eigenschaftswerts definieren. Der get
-Accessor ruft den Wert der Eigenschaft ab, während der set
-Accessor den Wert der Eigenschaft festlegt. Eine Eigenschaft kann einen oder beide Accessoren haben. Dies hängt davon ab, ob die Eigenschaft schreibgeschützt oder beschreib- und lesbar ist bzw. sein soll.
Frage 7: Was ist mit Boxing und Unboxing in C# gemeint?
Boxing und Unboxing werden in C# für Typumwandlungen genutzt.
- Das Umwandeln von einem Werttyp in einen Referenztyp bezeichnet man als Boxing, zum Beispiel von einem einfachen Datentyp wie int zu object. Boxing ist eine implizite Konvertierung.
- Das Umwandeln von einem Referenztyp in einen Werttyp bezeichnet man dgegen als Unboxing. Das Unboxing kann nur zu dem exakten Werttyp erfolgen, der ursprünglich geboxt wurde – beispielsweise wenn object wieder zu int umgewandelt wird.
Frage 8: Was versteht man unter dem Aufzählungstyp (enum) und wozu wird er in C# verwendet?
Ein Enum ist ein Werttyp mit einer Gruppe von verwandten benannten Konstanten. Diese Gruppe wird auch als „Enumeratorliste“ bezeichnet. Enums sind aufgelistete Datentypen in C#, die als primitive Datentypen benutzerdefiniert sind. Das Schlüsselwort enum
wird verwendet, um eine Aufzählung zu deklarieren.
Enums werden immer dann genutzt, wenn im .NET Framework numerische Konstanten erstellt werden sollen. Alle Mitglieder des Enums sind vom Enum-Typ. Daher muss für jeden Enum-Typ ein numerischer Wert vorhanden sein. Diese Enum-Werte sind festgelegt. Ein Enum kann als Zeichenfolge angezeigt und als Ganzzahl verarbeitet werden.
Der zugrunde liegende Standardtyp des Enumerationselements ist int. Standardmäßig hat der erste Enumerator den Wert 0, und der Wert jedes aufeinanderfolgenden Enumerators wird um 1 erhöht. Diese Werte können aber auch manuell festgelegt werden, beispielsweise ist dann 10 = On und 20 = Off.
Frage 9: Welchen Unterschied gibt es zwischen Dispose und Finalize in C#?
In C# werden beide Methoden verwendet, um Ressourcen freizugeben.
Die Dispose-Methode gibt nicht verwaltete Ressourcen frei, beispielsweise Datenbankverbindungen, die nicht automatisch vom .NET-Laufzeit-Host verwaltet werden. Sie wird normalerweise in einer Klasse implementiert. Diese implementiert wiederum das IDisposable-Interface, das die Dispose-Methode definiert.
Diese Methode wird explizit dann vom Clientcode aufgerufen, wenn nicht mehr benötigte Ressourcen freigegeben werden sollen. Sie kann implizit durch die Anweisung using
aufgerufen werden. Dadurch wird sicherstellt, dass die Dispose-Methode aufgerufen wird, wenn das Objekt außerhalb des Gültigkeitsbereichs geht.
Die Finalize-Methode wird hingegen verwendet, um Bereinigungsoperationen an einem Objekt kurz vor dem Garbage-Collection-Vorgang durchzuführen. Daher wird sie normalerweise in einer Klasse implementiert, die die Object.Finalize-Methode außer Kraft setzt.
Frage 10: Welche Vorteile bieten Erweiterungsmethoden in C#?
Mit einer Erweiterungsmethode kann die Funktionalität eines vorhandenen Typs erweitert werden, ohne den ursprünglichen Typ zu ändern oder einen neuen abgeleiteten Typ zu erstellen. Erweiterungsmethoden ermöglichen es Entwicklerinnen und Entwicklern, Methoden zu vorhandenen Typen wie Klassen, Strukturen, Schnittstellen, Enums etc. hinzuzufügen, die ursprünglich nicht in diesen Typen definiert wurden.
Erweiterungsmethoden werden in einer statischen Klasse deklariert und als statische Methoden mit einem speziellen ersten Parameter namens this
definiert. Dieser gibt den Typ an, der erweitert wird. Gleichzeitigt ermöglicht er, die Erweiterungsmethode aufzurufen, als ob es sich um eine Instanzmethode dieses Typs handelt.
Tipp: Die C#-Fragen im Vorstellungsgespräch können stark varriieren
Welche Person des potenziellen Arbeitgebers am Vorstellungsgespräch teilnimmt, kann einen Hinweis darauf geben, wie tief die Fragen zu Programmierkenntnissen reichen werden. Oft ist es so, dass Recruiterinnen und Recruiter nicht das nötige Fachwissen haben, um eine detaillierte Diskussion zu den Fachkenntnissen eines bestimmen Bereichs zu führen, beispielsweise zu Kategorien oder Objekten bei C#.
Anders sieht es aus, wenn beispielsweise der Lead Software Architect oder die Webentwicklerin mit am Tisch sitzen. Dann ist es gerade bei Jobs jenseits des Berufseinstiegs mehr oder weniger gesetzt, dass Fragen rund um den Fachbereich gestellt werden. Schließlich wollen die zukünftigen Kolleginnen und Kollegen wissen, inwiefern das neue Teammitglied im Arbeitsalltag unterstützen kann.