Що таке C #, еквівалентний isInstance () Java?


Відповіді:


52

Еквівалент Java obj.getClass().isInstance(otherObj)в C # такий:

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

Зауважте, що в той час як і Java, і C # працюють над об'єктом типу виконання (Java java.lang.Class# C # System.Type) obj(через .getClass()vs .getType()), Java isInstanceприймає об'єкт як свій аргумент, тоді як C # IsAssignableFromочікує інший System.Typeоб'єкт.


1
Примітка. IsAssignableFrom бере тип, а не об’єкт, тому вам потрібно фактично зробити OtherObj.getType ().
FlySwat

3
Дякуємо Джону - і пам’ятайте, це вікі! Я не обурююсь, що люди виправляють мої помилки.
Конрад Рудольф

1
цікаво ... у Java JVM обробляє "instanceof" спеціально, мабуть, дуже швидко, що може пояснити, чому це незвично ключове слово (у Java також є метод isAssignable).
Майкл Ніл

Чому цей метод кращий за оператор "є", який є більш читабельним?
Тімоті Гонсалес,

@TimothyGonzalez, бо це робить щось інше. Він перевіряє, чи мають дві змінні однаковий тип. isпотрібна назва типу, навпаки. Ось чого хотів OP: еквівалент Java isInstance. Інша відповідь просто неправильна, незважаючи на смішну кількість голосів.
Конрад Рудольф


39

Залежить, використовуйте, isякщо ви не хочете використовувати результат акторського складу, і використовуйте, asякщо хочете. Навряд чи ти коли-небудь захочеш написати:

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

Замість:

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

2

просто від маківки, ви також можете зробити:

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

Не впевнений, який би працював краще. Я залишу це для когось іншого для порівняння :)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.