То, каковы рабочие характеристики, 'является' отражением в C#? [дубликат]

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$('#hideshow').click(function(){
    $('#content').toggle('show');
  });
});
</script>

И html

<div id='content'>Hello World</div>
<input type='button' id='hideshow' value='hide/show'>
20
задан Ben Collins 15 July 2014 в 14:50
поделиться

4 ответа

Существует несколько опций:

  1. классик бросил : Foo foo = (Foo)bar
  2. as оператор броска: Foo foo = bar as Foo
  3. is тест : bool is = bar is Foo
<час>
  1. классик бросил потребности проверить, может ли bar быть безопасно брошен к Foo (быстрый), и затем на самом деле сделать это (медленнее) или выдают исключение (действительно медленный).
  2. as оператор должен проверить, может ли bar быть брошен, то сделать бросок, или если он не может быть безопасно брошен, затем он просто возвращается null.
  3. is оператор просто проверяет, может ли bar быть брошен Foo и возврату boolean.

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

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

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

20
ответ дан 30 November 2019 в 00:09
поделиться

Путем я узнал, что случается так что это:

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

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

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

это достаточно медленный для имения значение? Вероятно, не, но именно такая простая вещь обратить внимание для, Вы могли бы также сделать это.

7
ответ дан 30 November 2019 в 00:09
поделиться

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

3
ответ дан 30 November 2019 в 00:09
поделиться

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

6
ответ дан 30 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

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