Réponses:
Les différentes réponses ici ont deux significations différentes.
Si vous souhaitez vérifier si une instance est d' un type exact, alors
if (c.GetType() == typeof(TForm))
est la voie à suivre.
Si vous voulez savoir s'il cs'agit d'une instance TForm ou d'une sous-classe, utilisez is/ as:
if (c is TForm)
ou
TForm form = c as TForm;
if (form != null)
Cela vaut la peine d'être clair dans votre esprit pour savoir lequel de ces comportements vous voulez réellement.
iset asavec la correspondance de motifs:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
ou si vous prévoyez d'utiliser en ctant que TForm, utilisez l'exemple suivant:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
Le deuxième exemple n'a besoin de vérifier si cest de type TFormqu'une seule fois. Où est si vous vérifiez si voir si cest de type TFormpuis le cast, le CLR subit une vérification supplémentaire. Voici une référence .
Edit: volé à Jon Skeet
Si vous voulez vous assurer que cc'est de TFormet non une classe héritant de TForm, alors utilisez
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Oui, le mot-clé "est":
if (c is TForm)
{
...
}
Voir les détails sur MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
Vérifie si un objet est compatible avec un type donné. Par exemple, il peut être déterminé si un objet est compatible avec le type de chaîne comme ceci:
Aussi, un peu dans la même veine
Type.IsAssignableFrom(Type c)
"Vrai si c et le Type actuel représentent le même type, ou si le Type actuel est dans la hiérarchie d'héritage de c, ou si le Type actuel est une interface que c implémente, ou si c est un paramètre de type générique et le Type actuel représente l'une des contraintes de c. "
De là: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())similaire à l' instanceofopérateur Java .
T1.IsAssignableFrom(T2)retourne truedans les situations où l' asopérateur renvoie une valeur non nulle, étant donné les instances de ces types.
Un peu plus compact que les autres réponses si vous souhaitez utiliser c comme TForm:
if(c is TForm form){
form.DoStuff();
}
Comme d'autres l'ont mentionné, le mot-clé «est». Cependant, si vous allez le convertir plus tard dans ce type, par exemple.
TForm t = (TForm)c;
Ensuite, vous devez utiliser le mot-clé "as".
par exemple TForm t = c as TForm.
Ensuite, vous pouvez vérifier
if(t != null)
{
// put TForm specific stuff here
}
Ne combinez pas comme c'est parce que c'est une vérification en double.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
ou plus simple
bool isValid = c.GetType() == typeof(TForm);
==). Dans les langages objets ou orientés prenant en charge l'héritage, sauf si vous savez que votre type spécifique ne sera jamais hérité d'une sealedclasse par exemple . Aussi: l'utilisation d'un opérateur ternaire renvoyant des valeurs booléennes (statiques / constantes) me dérange, je serais moins gêné si c'était une switchinstruction.
instanceofet C #issont de bien meilleurs moyens de le faire.