Ich kenne is
und as
für instanceof
, aber was ist mit der reflektierenden isInstance() Methode?Wie ist das C# -Aquivalent zu Java isInstance()?
Antwort
Das Äquivalent von Java obj.getClass().isInstance(otherObj)
in C# ist wie folgt:
bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
anzumerken, dass, während sowohl Java und C# Arbeit an den Laufzeittyp Objekt (Java java.lang.Class
≣ C# System.Type
) eines obj
(via .getClass()
vs .getType()
), isInstance
von Java nimmt ein Objekt als sein Argument, während C# IsAssignableFrom
ein anderes System.Type
Objekt erwartet.
direkt an der Spitze von meinem Kopf, können Sie auch tun:
bool result = ((obj as MyClass) != null)
Nicht sicher, was besser durchführen würde. Ich werde es an jemand anderen zu Benchmark überlassen :)
bool result = (obj is MyClass); // Better than using 'as'
Funktioniert es auch für Klassen, die Vererbung verwenden? ('neues Kind() ist übergeordnetes') –
ja es tut, genau, wie Sie über –
hier geprüft zeigen, funktioniert es für Klassen, die Benutzervererbung. Danke, Mann. –
Hängt, is
verwenden, wenn Sie möchten, und as
nicht das Ergebnis der Besetzung verwenden, wenn Sie tun. Sie wollen so gut wie nie schreiben:
if(foo is Bar) {
return (Bar)foo;
}
Statt:
var bar = foo as Bar;
if(bar != null) {
return bar;
}
Below-Code kann zu IsAssignableFrom
Alternative sein.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Siehe Type.IsInstanceOfType Beschreibung in MSDN.
Hinweis IsAssignableFrom benötigt einen Type, kein Objekt, daher müssen Sie OtherObj.getType() ausführen. – FlySwat
Danke Jon - und denk dran, das ist ein Wiki! Ich ärgere mich nicht, dass Leute meine Fehler korrigieren. –
interessant ... in Java behandelt die JVM "instanceof" speziell, anscheinend ist es sehr, sehr schnell, was erklären könnte, warum es ungewöhnlich ein Schlüsselwort ist (es gibt auch eine isAssignable-Methode in Java). –