Jaki jest C # odpowiednik isInstance () w języku Java?

Odpowiedzi:

52

Odpowiednik języka Java obj.getClass().isInstance(otherObj)w C # jest następujący:

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

Zauważ, że podczas gdy zarówno Java, jak i C # działają na obiekcie typu runtime (Java java.lang.Class≣ C # System.Type) obj(via .getClass()vs .getType()), Java isInstanceprzyjmuje obiekt jako swój argument, podczas gdy C # IsAssignableFromoczekuje innego System.Typeobiektu.

Konrad Rudolph
źródło
1
Uwaga IsAssignableFrom przyjmuje Type, a nie obiekt, więc musisz faktycznie wykonać OtherObj.getType ().
FlySwat
3
Dzięki Jon - i pamiętaj, to jest wiki! Nie żałuję, że ludzie poprawiają moje błędy.
Konrad Rudolph
1
interesujące ... w javie JVM traktuje "instanceof" specjalnie, najwyraźniej bardzo szybko, co może wyjaśniać, dlaczego jest to niezwykle słowo kluczowe (w java jest też metoda isAssignable).
Michael Neale,
Dlaczego ta metoda jest lepsza niż operator „jest”, który jest bardziej czytelny?
Timothy Gonzalez,
@TimothyGonzalez Ponieważ robi coś innego. Sprawdza, czy dwie zmienne mają ten sam typ. iswymagał natomiast nazwy typu. Właśnie tego chciał OP: odpowiednik Java isInstance. Druga odpowiedź jest po prostu błędna, pomimo absurdalnej liczby głosów za.
Konrad Rudolph
181
bool result = (obj is MyClass); // Better than using 'as'
Ana Betts
źródło
1
Czy to działa nawet dla klas, które używają dziedziczenia? ( new Child() is Parent)
Tomáš Zato - Przywróć Monikę
1
testowane tutaj, działa dla klas dziedziczonych przez użytkowników. Dzięki stary.
Guilherme Golfetto
39

Zależy, użyj, isjeśli nie chcesz używać wyniku rzutowania i użyj, asjeśli to zrobisz. Rzadko kiedy chcesz pisać:

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

Zamiast:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}
Robert Gowland
źródło
2

tuż przy mojej głowie, możesz też zrobić:

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

Nie jestem pewien, który będzie działał lepiej. Zostawię to komuś innemu do analizy porównawczej :)

CodingWithSpike
źródło
2

Poniższy kod może być alternatywą dla IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Zobacz opis Type.IsInstanceOfType w witrynie MSDN.

Youngjae
źródło