2010-08-24 6 views
115

L'utilisation de cela pour vérifier si c est une instance de TForm.vérifier si l'instance d'un type

c.GetType().Name.CompareTo("TForm") == 0 

est-il un moyen sûr plus de type à faire en plus d'utiliser une chaîne comme param pour CompareTo()?

+4

Wow, qui vous a dit de le faire de cette façon ?! Tant d'étapes supplémentaires! –

+0

Je suis principalement un développeur Java, dans l'équipe que je code à peine en C#. – Lennie

+16

J'espère que vous ne le ferez pas non plus dans Java de cette façon. Les instances 'instanceof' de Java et' is 'de C# sont de bien meilleures façons de le faire. – Powerlord

Répondre

293

Les différentes réponses ont ici deux significations différentes.

Si vous voulez vérifier si une instance est de un type exact puis

if (c.GetType() == typeof(TForm)) 

est le chemin à parcourir.

Si vous voulez savoir si c est une instance de TFormou une sous-classe puis utilisez is/as:

if (c is TForm) 

ou

TForm form = c as TForm; 
if (form != null) 

Il vaut la peine d'être clair dans votre esprit sur lequel de ces comportements vous voulez réellement.

+6

Une petite note: utilisez "is" si vous ne voulez pas utiliser le résultat de la distribution et utilisez "as" si vous le faites. –

+5

Avec C# 7 vous pouvez combiner 'is' et' as' avec la correspondance de motifs: 'if (x est TForm tf) {...' – Richard

29
if(c is TFrom) 
{ 
    // Do Stuff 
} 

ou si vous prévoyez d'utiliser c comme TForm, utilisez l'exemple suivant:

var tForm = c as TForm; 
if(tForm != null) 
{ 
    // c is of type TForm 
} 

Le deuxième exemple a seulement besoin de vérifier si c est de type TForm une 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 un reference.

Edit: Volée Jon Skeet

Si vous voulez vous assurer c est de TForm et non une classe héritant de TForm, puis utilisez

if(c.GetType() == typeof(TForm)) 
{ 
    // Do stuff cause c is of type TForm and nothing else 
} 
3

Essayez le

suivant
if (c is TForm) { 
... 
} 
0

ou

c.getType() == typeOf(TForm) 
-1
bool isValid = c.GetType() == typeof(TForm) ? true : false; 

ou plus simple

bool isValid = c.GetType() == typeof(TForm); 
+0

@slartidan, très mignon. Ceci est clairement utile. – Gabe

+0

IMHO: J'éviterais une compassion directe (ie '==' '). 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é par exemple d'une Classe 'sealed'. Aussi: l'utilisation d'un opérateur ternaire renvoyant des valeurs booléennes (statiques/constantes) me dérange, je serais moins dérangé s'il s'agissait d'une instruction 'switch'. – SkidRunner

2

Comme d'autres l'ont mentionné, le mot-clé "est". Cependant, si vous allez plus tard le jeter à 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 pas combiner comme avec est parce qu'il est un chèque en double.

7

En outre, un peu dans le même vain

Type.IsAssignableFrom(Type c) 

« Vrai si c et le type de courant représentent le même type, ou si le type actuel est dans l'héritage hiérarchie des 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. "

D'ici: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

+0

c'est aussi mon favori personnel. 'typeof (Classe) .IsAssignableFrom (object.getType())' similaire à l'opérateur Java 'instanceof'. – SkidRunner

+0

Donne-t-il la valeur false s'il ne se trouve pas dans la même branche de la hiérarchie d'héritage mais s'il existe un opérateur de conversion? –

+0

Bonne question @PaulStelian. Je ne suis pas sûr du haut de ma tête mais je suppose que cela rendrait un faux dans cette situation. Ce serait au moins mon comportement attendu. Eventuellement, si une conversion implicite existe, elle peut renvoyer la valeur true, mais cela serait étrange. –

5

Un peu plus compact que les autres réponses si vous voulez utiliser c comme TForm:

if(c is TForm form){ 
    form.DoStuff(); 
}