Antworten:
Die unterschiedlichen Antworten hier haben zwei unterschiedliche Bedeutungen.
Wenn Sie überprüfen möchten, ob eine Instanz von einem genauen Typ ist, dann
if (c.GetType() == typeof(TForm))
ist der Weg zu gehen.
Wenn Sie wissen möchten, ob ces sich um eine Instanz TForm oder eine Unterklasse handelt, verwenden Sie is/ as:
if (c is TForm)
oder
TForm form = c as TForm;
if (form != null)
Es lohnt sich, sich klar darüber zu sein, welches dieser Verhaltensweisen Sie tatsächlich wollen.
isund asmit Mustervergleich:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
oder wenn Sie cals verwenden möchten TForm, verwenden Sie das folgende Beispiel:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
Das zweite Beispiel muss nur einmal überprüft werden, ob ces vom Typ ist TForm. Wenn Sie prüfen, ob ces sich um einen Typ handelt, und ihn TFormdann umsetzen , wird die CLR einer zusätzlichen Prüfung unterzogen. Hier ist eine Referenz .
Edit: Von Jon Skeet gestohlen
Wenn Sie sicherstellen möchten, dass ces sich um TFormeine Klasse handelt, von der keine erbt TForm, verwenden Sie
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Ja, das Schlüsselwort "is":
if (c is TForm)
{
...
}
Siehe Details zu MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
Überprüft, ob ein Objekt mit einem bestimmten Typ kompatibel ist. Beispielsweise kann festgestellt werden, ob ein Objekt mit dem Zeichenfolgentyp wie folgt kompatibel ist:
Auch etwas in die gleiche Richtung
Type.IsAssignableFrom(Type c)
"True, wenn c und der aktuelle Typ denselben Typ darstellen oder wenn sich der aktuelle Typ in der Vererbungshierarchie von c befindet oder wenn der aktuelle Typ eine von c implementierte Schnittstelle ist oder wenn c ein generischer Typparameter und der aktuelle Typ ist stellt eine der Einschränkungen von c dar. "
Von hier aus: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())ähnlich dem Java- instanceofOperator.
T1.IsAssignableFrom(T2)Renditen truein Situationen , in denen die asBetreiber liefert einen Wert ungleich Null, da Instanzen dieser Typen.
Etwas kompakter als die anderen Antworten, wenn Sie c als TForm verwenden möchten:
if(c is TForm form){
form.DoStuff();
}
Wie andere bereits erwähnt haben, ist das Schlüsselwort "is". Wenn Sie es jedoch später in diesen Typ umwandeln möchten, z.
TForm t = (TForm)c;
Dann sollten Sie das Schlüsselwort "as" verwenden.
z.B TForm t = c as TForm.
Dann können Sie überprüfen
if(t != null)
{
// put TForm specific stuff here
}
Nicht so kombinieren wie mit, da es sich um eine doppelte Prüfung handelt.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
oder einfacher
bool isValid = c.GetType() == typeof(TForm);
==). In objekt- oder orientierten Sprachen, die die Vererbung unterstützen, es sei denn, Sie wissen, dass Ihr spezifischer Typ niemals von beispielsweise einer sealedKlasse geerbt wird . Außerdem: Die Verwendung eines ternären Operators, der (statische / konstante) boolesche Werte zurückgibt, stört mich. Es würde mich weniger stören, wenn es sich um eine switchAnweisung handeln würde.
instanceofund C #issind viel bessere Möglichkeiten, dies zu tun.