Was ist das C # -Äquivalent zu Javas isInstance ()?


Antworten:


51

Das Äquivalent von Java obj.getClass().isInstance(otherObj)in C # lautet wie folgt:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

Beachten Sie, dass Java und C # zwar am Laufzeitobjekt (Java java.lang.Class≣ C # System.Type) eines obj(via .getClass()vs .getType()) arbeiten, Java jedoch isInstanceein Objekt als Argument verwendet, während C # ein IsAssignableFromanderes System.TypeObjekt erwartet .


1
Hinweis IsAssignableFrom verwendet einen Typ und kein Objekt. Sie müssen also OtherObj.getType () ausführen.
FlySwat

3
Danke Jon - und denk dran, das ist ein Wiki! Ich ärgere mich nicht darüber, dass Leute meine Fehler korrigieren.
Konrad Rudolph

1
interessant ... in Java behandelt die JVM "instanceof" speziell, anscheinend ist es sehr, sehr schnell, was erklären kann, warum es ungewöhnlich ein Schlüsselwort ist (es gibt auch eine isAssignable-Methode in Java).
Michael Neale

Warum ist diese Methode besser als der besser lesbare Operator "is"?
Timothy Gonzalez

@ TimothyGonzalez Weil es etwas anderes macht. Es wird geprüft, ob zwei Variablen denselben Typ haben. isbenötigte dagegen einen Typnamen. Dies ist, was OP wollte: das Äquivalent von Java isInstance. Die andere Antwort ist trotz der lächerlichen Anzahl von Upvotes einfach falsch.
Konrad Rudolph


39

Abhängig davon, verwenden isSie , wenn Sie das Ergebnis der Besetzung nicht verwenden möchten, und verwenden asSie, wenn Sie dies tun. Sie wollen kaum jemals schreiben:

if(foo is Bar) {
    return (Bar)foo;
}

Anstatt:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}

2

Sie können auch Folgendes tun:

bool result = ((obj as MyClass) != null)

Ich bin mir nicht sicher, welche besser abschneiden würde. Ich überlasse es jemand anderem zum Benchmarking :)


2

Der folgende Code kann eine Alternative zu sein IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Siehe Beschreibung von Type.IsInstanceOfType in MSDN.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.