75 votes

Quelle est la différence entre myCustomer.GetType() et typeof(Customer) en C# ?

J'ai vu les deux dans un code que je maintiens, mais je ne connais pas la différence. Y en a-t-il une ?

J'ajoute que myCustomer est une instance de Customer.

161voto

Kilhoffer Points 13430

Le résultat des deux est exactement le même dans votre cas. Ce sera votre type personnalisé qui dérive de System.Type . La seule vraie différence ici est que lorsque vous voulez obtenir le type d'une instance de votre classe, vous utilisez GetType . Si vous n'avez pas d'instance, mais que vous connaissez le nom du type (et que vous avez juste besoin de l'adresse réelle de l'instance), vous pouvez utiliser la fonction System.Type pour inspecter ou comparer à), vous utiliseriez typeof .

Différence importante

EDIT : Je voudrais ajouter que l'appel à GetType est résolu au moment de l'exécution, tandis que typeof est résolu au moment de la compilation.

39 votes

Je vote surtout pour le montage. Parce que c'est une distinction importante.

0 votes

Pas nécessairement exactement les mêmes. Supposons que VipCustomer hérite de Customer, si à un moment donné myCustomer = new VipCustomer() ; alors son GetType() sera différent du type Customer. Comme vous l'avez dit, le temps d'exécution et le temps de compilation sont deux choses très différentes.

27voto

Jeffrey L Whitledge Points 27574

GetType() est utilisé pour trouver le nom de l'utilisateur. réel le type d'une référence d'objet au moment de l'exécution. Il peut être différent du type de la variable qui fait référence à l'objet, en raison de l'héritage. typeof() crée un littéral de type qui est du type exact spécifié et qui est déterminé au moment de la compilation.

19voto

Jakub Šturc Points 12549

Oui, il y a une différence si vous avez un type hérité de Customer.

class VipCustomer : Customer
{
  .....
}

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

5voto

Chris Ballard Points 3125

Pour la première, vous avez besoin d'une instance réelle (par exemple myCustomer), pour la seconde, vous n'en avez pas besoin.

5voto

FlySwat Points 61945

Typeof(foo) est converti en une constante pendant le temps de compilation. foo.GetType() se produit au moment de l'exécution.

typeof(foo) se convertit aussi directement en une constante de son type (c'est-à-dire foo), donc cette opération échouerait :

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X