Каковы рабочие характеристики отражения "is" в С#?

Это показано, что "как" кастинг намного быстрее, чем приставка префикса, но как насчет "отражения"? Насколько плохо? Как вы можете себе представить, поиск "есть" в Google не очень эффективен.

Ответ 1

Есть несколько вариантов:

  • Классический листинг : Foo foo = (Foo)bar
  • Оператор литья as: Foo foo = bar as Foo
  • Тест is: bool is = bar is Foo

  • Классический листинг должен проверить, можно ли безопасно использовать bar для Foo (быстро), а затем сделать это (медленнее) или выбросить исключение (очень медленное).
  • Оператор as должен проверить, можно ли отличить bar, а затем выполнить бросок или если его нельзя безопасно отличить, он просто возвращает null.
  • Оператор is просто проверяет, может ли bar быть добавлено в Foo и вернуть boolean.

Тест is выполняется быстро, поскольку он выполняет только первую часть операции полного литья. Оператор as быстрее, чем классический, потому что не генерирует исключение, если приведение происходит неудачно (что делает его полезным для ситуаций, когда вы законно ожидаете, что бросок может потерпеть неудачу).

Если вам просто нужно знать, является ли переменная bar Foo, то используйте оператор is, НО, если вы собираетесь если bar является Foo, и если да, , то выберите, тогда вы должны использовать оператор as.

По сути, для того, чтобы убедиться, что акты действительны, каждая броска должна выполнять внутреннюю проверку эквивалента is. Поэтому, если вы выполните проверку is, за которой следует полный листинг (либо приведение as, либо с помощью классического оператора трансляции), вы эффективно выполняете проверку is дважды, что является небольшим дополнительным издержком.

Ответ 2

Я узнал, что это:

if (obj is Foo) {
  Foo f = (Foo)obj;
  f.doSomething();
}

медленнее, чем это:

Foo f = obj as Foo;
if (f != null) {
  f.doSomething();
}

Достаточно ли он достаточно велик? Наверное, нет, но это такая простая вещь, на которую нужно обратить внимание, чтобы вы могли это сделать.

Ответ 3

"is" в основном эквивалентен оператору IL "isinst", который эта статья описывает как быстро.

Ответ 4

Это должно быть достаточно быстро, чтобы не иметь значения. Если вы проверяете тип объекта, достаточный для его заметного влияния на производительность, вам нужно переосмыслить свой дизайн.