У меня есть программа, требующая быстрой работы. Внутри одного из своих внутренних циклов мне нужно проверить тип объекта, чтобы узнать, наследуется ли он от определенного интерфейса.C# 'оператор'
Один из способов сделать это будет с встроенной функцией проверки типа CLR. Самый элегантный метод там, вероятно, является «это» ключевое слово:
if (obj is ISpecialType)
Другой подход должен был бы дать свою собственную функцию виртуального GetType(), которая возвращает предопределенный значение перечисления (в моем случае это базовый класс, на самом деле , мне нужен только bool). Этот метод был бы быстрым, но менее элегантным.
Я слышал, что есть инструкция IL специально для ключевого слова 'is', но это не значит, что она выполняется быстро при переходе на встроенную сборку. Может ли кто-нибудь рассказать о производительности «is» по сравнению с другим методом?
ОБНОВЛЕНИЕ: Благодарим за все обоснованные ответы! Кажется, в ответах есть несколько полезных моментов: точка Андрея, касающаяся «есть», автоматически выполняет бросок, но данные производительности, собранные Binary Worrier и Ian, также чрезвычайно полезны. Было бы здорово, если бы один из ответов был отредактирован, чтобы включить все этой информации.
кстати, CLR не даст вам возможность создать свою собственную функцию Type GetType(), так как он нарушает одно из основных правил CLR - поистине типы – abatishchev
Er, я не совсем уверен, что вы подразумеваете под правилом «действительно типы», но я понимаю, что CLR имеет встроенную функцию Type GetType(). Если бы я использовал этот метод, это было бы с функцией другого имени, возвращающей некоторое перечисление, поэтому не было бы конфликта имен и символов. – JubJub
Я думаю, что абатищев означал «тип безопасности». GetType() не является виртуальным, чтобы препятствовать тому, чтобы тип лежал о себе и, следовательно, сохранял безопасность типов. –