Подтвердить что ты не робот

С# "является" оператором - это отражение?

Сегодня коллега задал мне интересный вопрос: "ключевое слово/оператор С#" считается "отражением"?

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

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

MSDN утверждает, что:

Обратите внимание, что оператор is учитывает только ссылки, конверсии бокса и распаковывание конверсий. Другие преобразования, такие как пользовательские преобразования, не рассматриваются оператором is.

Возможность рассматривать конвертированные в коробку и распакованные конверсии, по-видимому, подразумевает мне какую-то интроспекцию.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

EDIT:

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

Ответ 3

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

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