Что в C # эквивалентно Java isInstance ()?


Ответы:


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).
Майкл Нил

Чем этот метод лучше, чем более читаемый оператор "is"?
Тимоти Гонсалес

@TimothyGonzalez Потому что он делает что-то другое. Он проверяет, имеют ли две переменные одного и того же типа. isдля сравнения требуется имя типа. Это то, что хотел OP: эквивалент Java isInstance. Другой ответ просто неверен, несмотря на смехотворное количество голосов.
Конрад Рудольф

181
bool result = (obj is MyClass); // Better than using 'as'

1
Работает ли это даже для классов, использующих наследование? ( new Child() is Parent)
Томаш Зато - Reinstate Monica

1
протестирован здесь, он работает для классов, которые наследуются пользователем. Спасибо чувак.
Гильерме Гольфетто

39

Depends, используйте, 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.