Quand et où utiliser GetType() ou typeof()? [dupliquer]

cette question a déjà une réponse ici:

pourquoi cela fonctionne

if (mycontrol.GetType() == typeof(TextBox))
{} 

et ça, non?

Type tp = typeof(mycontrol);

mais cela fonctionne

Type tp = mycontrol.GetType();

j'utilise moi-même is opérateur pour vérifier le type, mais ma compréhension échoue lorsque j'utilise typeof() et GetType()

où et quand utiliser GetType() ou typeof() ?

35
demandé sur Jarrod Dixon 2012-07-03 17:34:30

4 réponses

typeof est un opérateur pour obtenir un type connu au compilation-time (ou au moins un paramètre de type générique). L'opérande de typeof est toujours le nom d'un type ou d'un paramètre de type - jamais une expression avec une valeur (par exemple une variable). Voir le spécification du langage C# pour plus de détails.

GetType() est une méthode que vous faites appel à des objets individuels, pour obtenir le type exécution-temps de l'objet.

notez que sauf si vous seulement voulez exactement des instances de TextBox (plutôt que des instances de sous-classes) vous utiliseriez habituellement:

if (myControl is TextBox)
{
    // Whatever
}

ou

TextBox tb = myControl as TextBox;
if (tb != null)
{
    // Use tb
}
71
répondu Jon Skeet 2012-07-03 13:42:48

typeof est appliqué à un nom d'un type ou d'un paramètre de type générique connu au moment de la compilation. GetType est appelé sur un objet à l'exécution. Dans les deux cas, le résultat est un objet de type System.Type contenant des méta-informations sur un type.

si vous avez

string s = "hello";

ces deux lignes sont valables

Type t1 = typeof(string);
Type t2 = s.GetType();

t1 == t2                    ==> true

mais

object obj = "hello";

Ces deux lignes sont valables

Type t1 = typeof(object); // ==> object
Type t2 = obj.GetType();  // ==> string!

t1 == t2                    ==> false

c'est-à-dire que le type de temps de compilation (type statique) de la variable obj n'est pas le même que le type d'exécution (le type dynamique) de l'objet référencé par obj . (Ici, "dynamique" n'a rien à voir avec le mot-clé dynamic !)


types D'Essais

si, cependant, vous voulez seulement savoir si mycontrol est un TextBox , alors vous pouvez simplement tester

if (mycontrol is TextBox)

notez que ceci n'est pas complètement équivalent à

if (mycontrol.GetType() == typeof(TextBox))    

parce que mycontrol pourrait avoir un type qui est dérivé de TextBox . Dans ce cas, la première comparaison donne true et la seconde false ! La première et plus facile variante est OK dans la plupart des cas, puisqu'un contrôle dérivé de TextBox hérite tout ce que TextBox a, ajoute probablement plus à elle et est donc affectation compatible à TextBox .

public class MySpecializedTextBox : TextBox
{
}

MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox)       ==> true

if (specialized.GetType() == typeof(TextBox))        ==> false

coulée

si vous avez le test suivant suivi d'un moulage et T est nul ...

if (obj is T) {
    T x = (T)obj; // The casting tests, whether obj is T again!
    ...
}

... vous pouvez la changer ...

T x = obj as T;
if (x != null) {
    ...
}

L'essai visant à déterminer si une valeur est d'un type et d'une coulée donnés (qui implique à nouveau ce même essai) peut à la fois: cela prend du temps pour les longues chaînes d'héritage. L'utilisation de l'opérateur as suivi d'un test pour null est plus efficace.

en commençant par C# 7.0, vous pouvez simplifier le code en utilisant la correspondance de motif:

if (obj is T t) {
    // t is a variable of type T
    ...
}
30
répondu Olivier Jacot-Descombes 2018-05-17 14:28:05

typeOf est un mot-clé C# qui est utilisé lorsque vous avez le nom de la classe. Il est calculé au moment de la compilation et ne peut donc pas être utilisé sur une instance créée au moment de l'exécution. GetType est une méthode de la classe objet qui peut être utilisée sur une instance.

8
répondu Fr33dan 2012-07-03 13:38:33

vous pouvez trouver plus facile d'utiliser le is mot-clé :

if (mycontrol is TextBox)
5
répondu Jonathon Reinhart 2012-07-03 13:38:22