typeof() vs .GetType()

Um den Typen nach System.Type bestimmen zu können, werden entweder der Operator typeof() oder die Instanzmethode getType() verwendet. Diese beiden Möglichkeiten liefern ein Objekt vom Typ System.Type zurück.

Oft wird die Frage gestellt, welcher Unterschied zwischen diesen beiden Möglichkeiten der Typ-Bestimmung besteht.

Der typeof()-Operator kann nur das Objekt von System.Type eines Typen (eine Klasse) bestimmen.

(Achtung: In C# sind auch die oft als primitiven Typen bezeichneten Wertetypen, z. B. Integer (int) oder Double (double) Klassen!)

Dabei kann der typeof()-Operator auch generische Typen bestimmen. Überladen werden, kann dieser Operator jedoch nicht.

[csharp] System.Type type = typeof(double);
[/csharp]

getType() ist eine Methode einer Instanz (eines Objekts). getType() kann daher nicht frei verwendet werden, wie der typeof()-Operator, sondern ist an eine Instanz gebunden. getType() liefert den Typen, der eigenen Instanz zurück.

[csharp] double d = 5.4;
System.Type type = d.GetType();
[/csharp]

getType() kann im Gegensatz zu typeof() auch überladen werden. GetType() kann allerdings nicht (typeof() natürlich auch nicht) überschrieben werden.

Auf den Punkt gebracht: Zur Bestimmung von Typen von Klassen wird der Operator typeof() benutzt. Die Bestimmung von Typen von Objekten ist hingegen die Methode getType() zu benutzen.

Nachfolgend eine kleine, vergleichende Veranschauung. Es soll der Typ Int32 festgestellt werden.

[csharp] int number = 4;

Type[] types = new Type[3];

types[0] = typeof(int);

// types[1] = typeof(number); // Not possible!

types[2] = number.GetType();

for (int i = 0; i < types.Length; i++) { if (null != types[i]) { Console.WriteLine("Type[" + i.ToString() + "]: " + types[i].Name); } } [/csharp] Ausgabe:

Type[0]: Int32
Type[2]: Int32

Es wurde mit typeof() genauso wie mit getType() der System.Type Int32 festgestellt.

Ein anderes Beispiel mit einer eigenen Klasse, TestClass:

[csharp] public class TestClass
{
public TestClass()
{

}
}
[/csharp]

Es wird versucht, das Objekt von System.Type für diese Klasse TestClass zu ermitteln:

[csharp] TestClass tc = new TestClass();

Type[] types = new Type[3];

// types[0] = typeof(tc); // Not possible!
types[1] = typeof(TestClass);
types[2] = tc.GetType();

for (int i = 0; i < types.Length; i++) { if (null != types[i]) { Console.WriteLine("Type[" + i.ToString() + "]: " + types[i].Name); } } [/csharp] Ausgabe:

Type[1]: TestClass
Type[2]: TestClass

1 Gedanke zu “typeof() vs .GetType()

Kommentare sind geschlossen.