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

73

Ich habe beide in einem Code gesehen, den ich pflege, aber ich kenne den Unterschied nicht. Ist dort eines?

Lassen Sie mich hinzufügen, dass myCustomer eine Instanz von Customer ist

user18931
quelle

Antworten:

159

Das Ergebnis von beiden ist in Ihrem Fall genau das gleiche. Es wird Ihr benutzerdefinierter Typ sein, von dem abgeleitet wird System.Type. Der einzige wirkliche Unterschied besteht darin, dass Sie verwenden, wenn Sie den Typ von einer Instanz Ihrer Klasse erhalten möchten GetType. Wenn Sie keine Instanz haben, aber den Typnamen kennen (und nur den tatsächlichen Namen System.Typezum Überprüfen oder Vergleichen benötigen ), würden Sie verwenden typeof.

Wichtiger Unterschied

BEARBEITEN: Lassen Sie mich hinzufügen, dass der Aufruf von zur GetTypeLaufzeit aufgelöst wird, während er typeofzur Kompilierungszeit aufgelöst wird.

Kilhoffer
quelle
37
Ich stimme hauptsächlich für die Bearbeitung. Weil das ein wichtiger Unterschied ist.
Benjamin Autin
nicht unbedingt genau das gleiche. Angenommen, VipCustomer erbt vom Kunden. Wenn irgendwann myCustomer = new VipCustomer (); dann würde sich GetType () vom Typ Customer unterscheiden. Wie Sie sagten, sind Laufzeit und Kompilierungszeit zwei sehr unterschiedliche Dinge.
LongChalk
27

GetType () wird verwendet, um den tatsächlichen Typ einer Objektreferenz zur Laufzeit zu ermitteln. Dies kann sich aufgrund der Vererbung vom Typ der Variablen unterscheiden, die auf das Objekt verweist. typeof () erstellt ein Type-Literal, das genau dem angegebenen Typ entspricht und zur Kompilierungszeit festgelegt wird.

Jeffrey L Whitledge
quelle
20

Ja, es gibt einen Unterschied, wenn Sie einen vom Kunden geerbten Typ haben.

class VipCustomer : Customer
{
  .....
}

static void Main()
{
   Customer c = new VipCustomer();
   c.GetType(); // returns typeof(VipCustomer)
}
Jakub Šturc
quelle
5

Zum einen benötigen Sie eine tatsächliche Instanz (dh myCustomer), zum anderen nicht

Chris Ballard
quelle
5

typeof (foo) wird während der Kompilierungszeit in eine Konstante konvertiert. foo.GetType () geschieht zur Laufzeit.

typeof (foo) konvertiert auch direkt in eine Konstante seines Typs (dh foo), sodass dies 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)
FlySwat
quelle
2

typeof wird zur Kompilierungszeit ausgeführt, während GetType zur Laufzeit ausgeführt wird. Das ist das Besondere an diesen beiden Methoden. Wenn Sie sich mit der Typhierarchie befassen, können Sie den genauen Typnamen eines Typs einfach durch Ausführen von GetType ermitteln.

public Type WhoAreYou(Base base)
{
   base.GetType();
}
David Pokluda
quelle
1

Der Operator typeof verwendet einen Typ als Parameter. Es wird zur Kompilierungszeit behoben. Die GetType-Methode wird für ein Objekt aufgerufen und zur Laufzeit aufgelöst. Der erste wird verwendet, wenn Sie einen bekannten Typ verwenden müssen, der zweite dient zum Abrufen des Typs eines Objekts, wenn Sie nicht wissen, was es ist.

class BaseClass
{ }

class DerivedClass : BaseClass
{ }

class FinalClass
{
    static void RevealType(BaseClass baseCla)
    {
        Console.WriteLine(typeof(BaseClass));  // compile time
        Console.WriteLine(baseCla.GetType());  // run time
    }

    static void Main(string[] str)
    {
        RevealType(new BaseClass());

        Console.ReadLine();
    }
}
// *********  By Praveen Kumar Srivastava 
Praveen Kumar
quelle