2013-03-03 2 views
1

В чем разница между выполнением явного литья и использованием в качестве/синтаксиса?Что лучше в отношении производительности во время выполнения: Явное литье или 'as'/'является синтаксисом

// explicit casting 
var castedObj = (ICar)originalObj; 

// 'as' casting 
var obj2 = originalObj as ICar; 

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

Правильно ли я?

+0

Прочтите этот ответ здесь http://stackoverflow.com/a/14060644/448407 – Dinesh

ответ

1

Кастинг требует проверки времени выполнения, поэтому разница очень мало.

as возвращает null или casted object, поэтому у него могут быть небольшие дополнительные накладные расходы при назначении ссылки [EDIT: Но это не так; см. блог, указанный ниже]

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

Технически для гипсе Ил добытого (для примера литья object к string).

castclass string 

и для as:

isinst string 

Смотрите следующий блог, где кто-то сделал некоторые подробные тайминги (и обнаружил, что isinst незначительно быстрее, но не на любую сумму, что вы заботитесь о):

http://m3mia.blogspot.co.uk/2007/11/comparing-isinst-to-castclass.html

1

Почему разве вы не просматриваете это и не видите сами?

Важно то, что в вашем первом случае, если это не ICar, это вызовет исключение. Вы можете обернуть это в блок try/catch и обработать исключения, но, скорее всего, быстрее использовать ключевое слово «as», которое присваивает null объекту obj2, если originalobj не является ICar, тогда вы можете просто выполнить нулевую проверку, а не полагаться на более дорогостоящую обработку исключений.

Однако на сегодняшних машинах разница в производительности будет незначительной.

3

Performance не должны иметь ничего общего с вашим выбором:

  • Если вы знаете, что это ICar, используйте бросок.

  • Если вы не знаете, используйте «как» и проверьте результат на null.

Использование в зависимости от того, что выражает ваше намерение.

Смежные вопросы