75 Stimmen

Was ist der Unterschied zwischen myCustomer.GetType() und typeof(Customer) in C#?

Ich habe beides in einem Code gesehen, den ich betreue, kenne aber den Unterschied nicht. Gibt es einen?

Ich möchte hinzufügen, dass myCustomer eine Instanz von Customer ist.

162voto

Kilhoffer Punkte 31599

Das Ergebnis ist in Ihrem Fall genau dasselbe. Es wird Ihr benutzerdefinierter Typ sein, der sich ableitet von System.Type . Der einzige wirkliche Unterschied besteht darin, dass Sie, wenn Sie den Typ von einer Instanz Ihrer Klasse erhalten möchten, die Funktion GetType . Wenn Sie keine Instanz haben, aber den Namen des Typs kennen (und nur den tatsächlichen System.Type zu überprüfen oder zu vergleichen), würden Sie verwenden typeof .

Wichtiger Unterschied

EDIT: Ich möchte hinzufügen, dass der Aufruf von GetType wird zur Laufzeit aufgelöst, während typeof wird zur Kompilierzeit aufgelöst.

27voto

Jeffrey L Whitledge Punkte 55524

GetType() wird verwendet, um die aktuell Typ einer Objektreferenz zur Laufzeit. Dieser kann sich aufgrund der Vererbung vom Typ der Variablen, die auf das Objekt verweist, unterscheiden. typeof() erzeugt ein Type-Literal, das genau den angegebenen Typ hat und zur Kompilierzeit bestimmt wird.

19voto

Jakub Šturc Punkte 33925

Ja, es gibt einen Unterschied, wenn Sie einen geerbten Typ von Customer haben.

class VipCustomer : Customer
{
  .....
}

static void Main()
{
   Customer c = new VipCustomer();
   c.GetType(); // returns typeof(VipCustomer)
}

5voto

Chris Ballard Punkte 3731

Für die erste benötigen Sie eine tatsächliche Instanz (z. B. myCustomer), für die zweite nicht

5voto

FlySwat Punkte 165766

Typeof(foo) wird während der Kompilierzeit in eine Konstante umgewandelt. foo.GetType() erfolgt zur Laufzeit.

typeof(foo) konvertiert auch direkt in eine Konstante seines Typs (d.h. foo), so dass dieser Vorgang fehlschlagen würde:

public class foo
{
}

public class bar : foo
{
}

bar myBar = new bar();

// Would fail, even though bar is a child of foo.
if (myBar.getType == typeof(foo))

// However this Would work
if (myBar is foo)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X