Это показано, что "как" кастинг намного быстрее, чем приставка префикса, но как насчет "отражения"? Насколько плохо? Как вы можете себе представить, поиск "есть" в Google не очень эффективен.
Каковы рабочие характеристики отражения "is" в С#?
Ответ 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
Это должно быть достаточно быстро, чтобы не иметь значения. Если вы проверяете тип объекта, достаточный для его заметного влияния на производительность, вам нужно переосмыслить свой дизайн.