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.