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 c
s'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.
is
et as
avec la correspondance de motifs:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
ou si vous prévoyez d'utiliser en c
tant 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 c
est de type TForm
qu'une seule fois. Où est si vous vérifiez si voir si c
est de type TForm
puis 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 c
c'est de TForm
et 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' instanceof
opérateur Java .
T1.IsAssignableFrom(T2)
retourne true
dans les situations où l' as
opé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 sealed
classe 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 switch
instruction.
instanceof
et C #is
sont de bien meilleurs moyens de le faire.