Typüberprüfung in C#: typeof, GetType oder is? Vollständige Analyse

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Typüberprüfung in C#: typeof, GetType oder is? Wie man sich nicht in drei Kiefern verirrt

\n\n

Jeder C#-Entwickler steht früher oder später vor der Notwendigkeit, den Typ eines Objekts zu überprüfen. Was könnte einfacher sein, könnte man meinen? Aber wenn man drei Optionen hat — typeof, GetType() und is —, schweift der Blick umher, und im Kopf stellt sich die berechtigte Frage: "Welche soll ich wählen?".

\n\n

Dieser Artikel ist nicht nur eine trockene Zusammenfassung aus der Dokumentation. Wir analysieren jeden Ansatz anhand realer Beispiele, decken Fallstricke auf und geben klare Empfehlungen. Nach der Lektüre werden Sie nicht mehr raten, sondern genau wissen, welches Werkzeug Sie in einer bestimmten Situation verwenden. Los geht's!

\n\n

Warum überhaupt Typen in C# überprüfen?

\n\n

Bevor wir in die Tiefe gehen, erinnern wir uns, warum wir das brauchen. C# ist eine streng typisierte Sprache, aber das schließt Situationen nicht aus, in denen der Typ eines Objekts erst zur Laufzeit bekannt ist. Hier sind die häufigsten Szenarien:

\n\n
    \n
  • Arbeit mit Schnittstellen und Basisklassen: Sie erhalten ein Objekt als object oder Basistyp und müssen seinen tatsächlichen "Charakter" ermitteln.
  • \n
  • Serialisierung und Deserialisierung: JSON oder XML kommen als Zeichenkette an, und der konkrete Typ muss wiederhergestellt werden.
  • \n
  • Reflection: Wenn Sie Objekte dynamisch erstellen oder Methoden aufrufen, wobei Sie nur den Typnamen kennen.
  • \n
  • Protokollierung und Fehlersuche: Manchmal muss man einfach im Log ausgeben, mit welchem Typ man gerade arbeitet.
  • \n
\n\n

Und hier betreten unsere drei Helden die Bühne. Lernen wir jeden von ihnen näher kennen.

\n\n

typeof — statischer Blick in die Zukunft

\n\n

typeof ist ein Operator, der ein System.Type-Objekt für einen zur Kompilierzeit bekannten Typ zurückgibt. Er funktioniert wie ein Auskunftsdienst: "Sag mir den Namen der Klasse, und ich gebe dir alle Informationen über sie."

\n\n

So funktioniert es:

\n
Type stringType = typeof(string);\nConsole.WriteLine(stringType.FullName); // Ausgabe: System.String\n\nType intType = typeof(int);\nConsole.WriteLine(intType.FullName); // Ausgabe: System.Int32
\n\n

Wesentliches Merkmal: typeof benötigt keine Instanz eines Objekts. Es ist eine statische Operation. Sie sagen dem Compiler: "Ich habe den Typ MyClass, gib mir seine Metadaten."

\n\n

Wann verwenden:

\n
    \n
  • Wenn Sie den Typ anhand des Klassennamens benötigen, nicht anhand eines Objekts.
  • \n
  • In Attributen (z.B. [AttributeUsage(typeof(MyAttribute))]).
  • \n
  • Bei Generics: typeof(List<>).
  • \n
\n\n

Fallstrick: typeof gibt immer den genauen Typ zurück, den Sie im Code angegeben haben. Er weiß nichts über Vererbung. Wenn Sie class Dog : Animal { } haben, wird typeof(Animal) niemals zu typeof(Dog).

\n\n

GetType() — dynamische Ermittlung

\n\n

Im Gegensatz zu typeof wird die Methode GetType() auf einer Instanz eines Objekts aufgerufen. Sie nimmt das tatsächliche Objekt, das im Speicher liegt, und sagt: "Aha, du bist also in Wirklichkeit das!".

\n\n

Beispiel:

\n
object obj = "Hallo, Welt!";\nType typeOfObj = obj.GetType();\nConsole.WriteLine(typeOfObj.FullName); // Ausgabe: System.String\n\n// Und jetzt ein Trick:\nobject obj2 = 42;\nType typeOfObj2 = obj2.GetType();\nConsole.WriteLine(typeOfObj2.FullName); // Ausgabe: System.Int32
\n\n

Beachten Sie: Die Variable obj ist als object deklariert, aber GetType() "sieht" durch diese Hülle hindurch und gibt System.String zurück. Das ist die dynamische Typbestimmung.

\n\n

Wann verwenden:

\n
    \n
  • Wenn Sie den genauen Typ eines Objekts zur Laufzeit ermitteln müssen.
  • \n
  • Für Typvergleiche: obj.GetType() == typeof(MyClass).
  • \n

Blogs

Buchempfehlungen