Von den Grund­la­gen der C#-Vorteile bis hin zu de­tail­lier­ten Er­klä­run­gen ver­schie­de­ner Elemente und deren Nutzung: Wir haben die es­sen­zi­el­len Fragen für dein Vor­stel­lungs­ge­spräch rund um die ob­jekt­ori­en­tier­te Pro­gram­mier­spra­che C# für dich auf­be­rei­tet.

In diesem Beitrag prä­sen­tie­ren wir 10 Fra­ge­stel­lun­gen, die in Be­wer­bungs­ver­fah­ren für De­ve­lo­p­ment-Po­si­tio­nen häufig vorkommen, inklusive der passenden Antworten. Natürlich existiert eine Vielzahl weiterer spe­zi­fi­scher Themen zu C#. Unser Ziel ist es, dir einen soliden Überblick von Ba­sis­wis­sen bis hin zu De­tail­fra­gen zu ver­schaf­fen und dich für eine gezielte Vor­be­rei­tung auf dein Gespräch zu sen­si­bi­li­sie­ren.

Frage 1: Was zeichnet C# aus und welche Plus­punk­te bietet die Sprache?

C# ist in Kom­bi­na­ti­on mit der Ent­wick­lungs­um­ge­bung Visual Studio primär auf Per­for­mance getrimmt. Als ob­jekt­ori­en­tier­te Sprache überzeugt C# durch eine moderne, intuitive An­wen­dungs­ent­wick­lung, die gleich­zei­tig enorm flexibel und kraftvoll ist. Viele Developer ent­schei­den sich daher für C#, wenn sie vor der Wahl stehen, welche Pro­gram­mier­spra­che sie lernen sollen.

Die Struktur von C# basiert kon­se­quent auf Klassen und Objekten. Es handelt sich um eine stark ty­pi­sier­te Sprache, die Konzepte wie Abs­trak­ti­on, Kapselung und Vererbung voll aus­schöpft. Primär ist sie darauf ausgelegt, innerhalb des Microsoft-.NET-Öko­sys­tems Höchst­leis­tun­gen zu erbringen.

Durch diesen Fokus besitzt C# einen spe­zi­fi­schen Aufbau, bei dem die meisten Typen innerhalb der .NET-Struk­tu­ren direkt von der Objekt-Klasse erben. Diese Klassen bringen wiederum Methoden, Ei­gen­schaf­ten, Felder und Er­eig­nis­se mit sich.

Frage 2: Wie wird der Begriff „Objekt“ in C# definiert?

Um das Objekt-Konzept zu greifen, muss man die grund­le­gen­de Logik von C# verstehen. In dieser ob­jekt­ori­en­tier­ten Welt wird das Fundament durch Klassen gelegt. Eine Klasse gibt die Da­ten­struk­tur vor und legt fest, wie In­for­ma­tio­nen ge­spei­chert, verwaltet oder über­tra­gen werden dürfen. Sie dient somit als Bauplan für alle weiteren Struk­tu­ren.

Objekte sind die tat­säch­li­chen Instanzen in C#, die realen Spei­cher­platz belegen. Als Objekt gelten alle Einheiten, die spe­zi­fi­sche Merkmale besitzen oder eine konkrete Aufgabe in der Software über­neh­men. Der Typ wird durch die Klasse vor­ge­ge­ben, wobei Instanzen das Gerüst für die weitere Pro­gramm­lo­gik bilden.

Ein Beispiel zur Ver­deut­li­chung: An­ge­nom­men, du pro­gram­mierst eine Anwendung für TV-Geräte. Zuerst de­fi­nierst du die Basis-Entität, also die Klasse „te­le­vi­si­on“. Für diesen Fernseher legen wir 5 Merkmale fest: Marke, Modell, Farbe, Diagonale und Preis. Diese Merkmale sind die Mit­glie­der der Klasse. Weitere Mit­glie­der 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 „te­le­vi­si­on“. Wichtig: Damit du auf diese Klasse zugreifen kannst, muss sie als „public“ definiert sein.

Frage 3: Was ist der Un­ter­schied zwischen Managed und Unmanaged Code in C#?

Managed Code

Als Managed Code be­zeich­net man in C# jenen Code, der innerhalb des .NET-Frame­works erstellt wurde. Er wird direkt von der Common Language Runtime (CLR) aus­ge­führt. Die Runtime kümmert sich um den gesamten Le­bens­zy­klus – von der Ob­jekter­stel­lung über die Spei­cher­ver­wal­tung bis hin zur Be­rei­ni­gung.

Unmanaged Code

Code, der außerhalb des .NET-Frame­works entsteht, wird als Unmanaged Code de­kla­riert. Dazu zählen An­wen­dun­gen, die nicht unter der direkten Aufsicht der CLR laufen.

Das .NET-Framework er­mög­licht es jedoch, Unmanaged Code in Managed Code zu trans­for­mie­ren (und umgekehrt). Das ist besonders wertvoll, da so auch für diesen Code die Vorteile der au­to­ma­ti­schen Spei­cher­ver­wal­tung und Aus­füh­rungs­kon­trol­le genutzt werden können.

Frage 4: Worin un­ter­schei­den sich struct und class?

In C# stehen die Begriffe Klasse (class) und Struktur (struct) für be­nut­zer­de­fi­nier­te Da­ten­ty­pen, die sich in we­sent­li­chen Punkten un­ter­schei­den:

Struktur (struct)

  • Ist ein Werttyp und erbt in C# implizit von System.ValueType.

  • Kann nicht von anderen Typen ab­ge­lei­tet werden.

  • Wird meist für kompakte Da­ten­men­gen genutzt.

  • Kann nicht abstrakt sein und benötigt eine direkte Im­ple­men­tie­rung.

  • Ein Stan­dard­kon­struk­tor kann nicht manuell zu­ge­wie­sen werden.

  • Die Nutzung des new-Keywords ist beim Erstellen nicht zwingend nötig.

Klasse (class)

  • Ist ein Re­fe­renz­typ und erbt implizit von System.Object.
  • Un­ter­stützt Vererbung und kann von anderen Klassen ab­ge­lei­tet werden.
  • Eignet sich ideal für komplexe Struk­tu­ren und große Da­ten­men­gen.
  • Kann abstrakt definiert werden, was eine direkte In­stan­zi­ie­rung ver­hin­dert.
  • Erlaubt die De­fi­ni­ti­on eines in­di­vi­du­el­len Stan­dard­kon­struk­tors.

Frage 5: Was un­ter­schei­det eine Schnitt­stel­le von einer abs­trak­ten Klasse?

Schnitt­stel­len (in­ter­faces) und abstrakte Klassen (abstract classes) dienen beide als Code-Verträge – sie de­fi­nie­ren etwa Vor­be­din­gun­gen für ab­ge­lei­te­te Klassen. Dennoch gibt es markante Un­ter­schie­de in ihrer Ar­beits­wei­se.

Mit solchen Verträgen legst du fest, welche An­for­de­run­gen beim Aufruf einer Methode oder Ei­gen­schaft erfüllt sein müssen.

Beim Thema Vererbung zeigt sich: Abstrakte Klassen dürfen sowohl fertigen Code als auch abstrakte Methoden enthalten. Bei Schnitt­stel­len hingegen müssen alle Methoden abstrakt sein. Abstrakte Klassen benötigen zur Kenn­zeich­nung das Keyword abstract.

Da C# keine Mehr­fach­ver­er­bung bei Klassen erlaubt, kann eine Klasse nur von maximal einer abs­trak­ten Klasse erben. Im Gegensatz dazu kannst du für eine Klasse beliebig viele Schnitt­stel­len im­ple­men­tie­ren.

Zudem können abstrakte Klassen Kon­struk­to­ren besitzen, die von Sub­klas­sen genutzt werden. Schnitt­stel­len bieten dies nicht, da sie keine Instanzen dar­stel­len und somit nicht in­itia­li­siert werden können.

Frage 6: Was sind Ei­gen­schaf­ten (pro­per­ties) in C#?

Ei­gen­schaf­ten sind Klas­sen­ele­men­te, über die du den Wert eines privaten Feldes auslesen, ändern oder berechnen kannst. Sie fungieren als kon­trol­lier­ter Zugang zur öf­fent­li­chen Schnitt­stel­le und erlauben es, Daten innerhalb einer Klasse sicher zu ma­ni­pu­lie­ren.

In der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung sind Ei­gen­schaf­ten ein Schlüs­sel­ele­ment, um einen sauberen Da­ten­zu­griff in Ap­pli­ka­tio­nen zu ge­währ­leis­ten.

De­kla­riert werden sie über get- und set-Ac­ces­so­ren. Während der get-Accessor den Wert liefert, schreibt der set-Accessor diesen. Je nachdem, ob ein Feld nur lesbar oder auch be­schreib­bar sein soll, nutzt du einen oder beide Ac­ces­so­ren.

Frage 7: Was bedeuten Boxing und Unboxing?

Diese Begriffe be­schrei­ben die Typ­um­wand­lung in C#.

  • Boxing ist die Um­wand­lung eines Werttyps in einen Re­fe­renz­typ (z. B. von int zu object). Dies geschieht implizit.
  • Unboxing ist der um­ge­kehr­te Weg: Ein Re­fe­renz­typ wird zurück in einen Werttyp ver­wan­delt. Dies funk­tio­niert nur, wenn der Zieltyp exakt dem ur­sprüng­li­chen Typ ent­spricht (z. B. von object zurück zu int).

Frage 8: Was ist ein Auf­zäh­lungs­typ (enum) und wofür wird er genutzt?

Ein Enum ist ein Werttyp, der eine Gruppe logisch zu­sam­men­ge­hö­ri­ger Kon­stan­ten bündelt (Enu­me­ra­tor­lis­te). Enums sind be­nut­zer­de­fi­nier­te Da­ten­ty­pen, die zur De­kla­ra­ti­on das Keyword enum nutzen.

Sie kommen immer dann zum Einsatz, wenn du im .NET-Framework mit nu­me­ri­schen Kon­stan­ten arbeitest. Jedes Mitglied eines Enums besitzt einen festen nu­me­ri­schen Wert. Vorteil: Ein Enum lässt sich im Code als lesbarer Text (String) anzeigen, wird intern aber effizient als Zahl ver­ar­bei­tet.

Stan­dard­mä­ß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 Un­ter­schied?

In C# dienen beide Wege dazu, Res­sour­cen wieder frei­zu­ge­ben.

Die Dispose-Methode räumt Unmanaged Resources auf, wie etwa Da­ten­bank­ver­bin­dun­gen, die nicht au­to­ma­tisch von .NET verwaltet werden. Sie wird in Klassen via IDis­posable-Interface im­ple­men­tiert.

Der Aufruf erfolgt explizit durch den Code, sobald Res­sour­cen nicht mehr gebraucht werden. Besonders elegant klappt das mit der using-Anweisung, die Dispose au­to­ma­tisch triggert, sobald das Objekt den Gül­tig­keits­be­reich verlässt.

Die Finalize-Methode hingegen wird vom Garbage Collector auf­ge­ru­fen, kurz bevor ein Objekt endgültig gelöscht wird, um letzte Auf­räum­ar­bei­ten zu erledigen. Sie wird durch das Über­schrei­ben der Object.Finalize-Methode im­ple­men­tiert.

Frage 10: Welchen Nutzen bringen Er­wei­te­rungs­me­tho­den?

Mit Er­wei­te­rungs­me­tho­den kannst du die Funk­tio­na­li­tät be­stehen­der Typen ausbauen, ohne deren Quellcode an­zu­pas­sen oder eine neue Klasse ab­zu­lei­ten. So fügst du Klassen, In­ter­faces oder Enums nach­träg­lich Methoden hinzu.

Diese Methoden werden in sta­ti­schen Klassen definiert. Der erste Parameter erhält das Keyword this, welches den zu er­wei­tern­den 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 Vor­stel­lungs­ge­spräch ge­gen­über­sitzt, ist ein guter Indikator für die Tiefe der Fragen. Per­so­nal­ver­ant­wort­li­che kon­zen­trie­ren sich oft auf das große Ganze, da ihnen meist das tiefe Fach­wis­sen für De­tail­dis­kus­sio­nen über C#-Ob­jekt­struk­tu­ren fehlt.

Triffst du jedoch auf den Lead Software Architect oder erfahrene Web-Developer, wird es fachlich. Besonders bei Po­si­tio­nen für Fort­ge­schrit­te­ne sind spe­zi­fi­sche Fragen zum Fach­be­reich Standard. Deine po­ten­zi­el­len Kolleg:innen möchten schließ­lich si­cher­stel­len, dass du im Ar­beits­all­tag eine echte Stütze für das Team bist.

Zum Hauptmenü