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.


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


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;
}

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 :)


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.