Вопрос по .net, typing, c#, introspection, reflection – C # «is» оператор - это отражение?

28

Коллега задал мне интересный вопрос сегодня - является ли ключевое слово / оператор C # & quot; is & quot; считается отражением?

object tmp = "a string";
if(tmp is String)
{
}

Как этот оператор реализован за кадром? Требуется ли рефлексия или самоанализ? Или из-за строго типизированной природы языка, является ли Тип объекта доступным сразу как атрибут верхнего уровня объекта в памяти?

MSDN говорится, что:

Note that the is operator only considers reference conversions, boxing conversions, and unboxing conversions. Other conversions, such as user-defined conversions, are not considered by the is operator.

Способность рассматривать конвертированные и распакованные конверсии, кажется, подразумевает какой-то самоанализ.

связанные сstackoverflow.com/questions/57701/… nawfal
Ссылка MSDN не работает. hina10531

Ваш Ответ

3   ответа
5

is Оператор по существу определяет, возможно ли приведение, но вместо того, чтобы генерировать исключение, когда приведение невозможно, оно возвращаетfalse, Если вы подумаете о том, чтобы применить отражение, то это тоже отражение.

РЕДАКТИРОВАТЬ:

После некоторых исследований я обнаружил, что приведение типов выполняется в IL p & # xE5;castclass инструкция в то время какis оператор отображает наisinst инструкция. FxCop имеетправило который предупреждает вас, если вы делаете ненужные приведения, сначала используяisinst а затемcastclass инструкция. Несмотря на то, что операции эффективны, они все равно имеют затраты производительности.

& 'Представл ет собой & APOS; Оператор возвращает истину / ложь и не ноль.
Вы правы в том, что я смешиваю "есть" и "как" в моем ответе. Я исправил свою ошибку.
Я думаю, что вы думаете о "как" оператор Matt
То, что вы описали, - это "как" оператор. «Является»; Оператор по сути та же самая операция, только с другим возвращаемым значением.
1

В других языках есть информация времени выполнения, достаточная для поддержки динамического приведения, и в то же время ничего такого, что можно было бы описать как отражение (очевидный пример - C ++).

Таким образом, рефлексия относится к дополнительным возможностям, помимо простого обнаружения типа объекта. Чтобы "отразить" Под объектом подразумевается способность обходить его участников, например.

Это было быmore правильно сказать, что отражение анализирует членов класса, а не объекта, поскольку вам не нужно иметь живой экземпляр. Кроме того, отражение позволяет «обнаруживать» какие классы у вас есть в сборке, не только члены и другая информация о классе.
C ++ имеет классы и библиотеки, Java имеет классы и пакеты. Объектно-ориентированное программирование определяет разницу между объектом и классом.
Кроме того, C ++ не может иметь отражения - поскольку в двоичные файлы не включена необходимая информация. - Вот почему вам нужны h-файлы, чтобы использовать двоичные файлы и lib-файлы для связи, ожидайте запуска сборок.
@Danny Varod - Не у всех языков есть классы или сборки.
34

Ссылка ECMA-335,is Оператор генерируетisinst инструкция IL объектной модели (Раздел III & # xA7; 4.6), которая является частью базового набора команд, а не частью библиотеки Reflection (Раздел IV & # xA7; 5.5).

Изменить:is Оператор чрезвычайно эффективен по сравнению с библиотекой отражений. Вы можете выполнить в основном тот же тест гораздо медленнее с помощью рефлексии:

typeof(T).IsAssignableFrom(obj.GetType())

Изменить 2: Вы не правы в отношении эффективностиcastclass а такжеisinst инструкции (которые вы сейчас отредактировали из поста). Они высоко оптимизированы в любой практической реализации виртуальной машины. Единственная реальная проблема производительности связана сcastclass бросить исключение, которое вы избегаете с помощью C #as оператор и тест дляnull (для справочных типов) илиis оператор, сопровождаемый приведением (для типов значений).

@SamHarwell, что ссылка на ECMA-335 разорвана, знаете ли вы обновленную версию?
Как я уже упоминал во втором редактировании, вы должны использоватьas с последующимnull проверьте для справочных типов. Вы вместо этого использовалиis за ним следует приведение, о котором вас предупреждает FxCop.
Я ничего не редактировал, но, возможно, мне следует уточнить, что я имею в виду под "дорогой". Я не очень много знаю об эффективности IL, но FxCop имеет предупреждение, если ваш код создания, который выдает команды isinst и castclass, считает их неэффективными или "дорогими".
Для чего стоит в Compact Framework, IL, который должен явно проверять RTTI (такой какisinst а такжеcastclass) медленно, как отражение, в то время как callvirt высоко оптимизирован. Мораль: старайтесь избегать использования конструкций типа case, где могут работать виртуальные / абстрактные методы.

Похожие вопросы