2009-12-17 2 views
22

Можно создать дубликат:
Perfomance of TypeCastingНасколько дорогой объект?

Насколько дорого бросить в качестве объекта как другой объект?

CustomClass instance = GenericObject as CustomClass 

Следует ли его избегать как все расходы?

Хочет посмотреть, как другие думают об этом. Я уверен, что это очень ситуативно.

ответ

44

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

Вашими первыми проблемами должны быть правильность кода и его ремонтопригодность.

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

Большинство проблем с производительностью в реальном мире возникают из-за выбора алгоритма или отсутствия понимания самой платформы, а не от конкретных особенностей языка.

+50

Может быть, вы могли бы добавить в конце немного о __the накладных расходов на тип casting__. Приятно иметь совет, но он не отвечает на вопрос. –

+0

Хороший ответ на другой вопрос. – Acidic

18

Нет, его не следует избегать любой ценой. Кастинг не очень дорог. Конечно, если у вас есть цикл, который работает миллион раз в секунду, может возникнуть смысл избегать кастинга, чтобы сохранить некоторую производительность, иначе это не вызовет проблем с производительностью.

Настоящая проблема с отливкой заключается в том, что она изменяет тип безопасности. Если вы не будете осторожны, не слишком сложно ввести ошибки или уменьшить читаемость кода, если вы бросаете вещи повсюду.

4

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

Также в другом упоминании о том, что беспокоиться о чем-то, так как бокс очень тривиален по сравнению с конкретными проблемами производительности или ремонтопригодностью кода. Я полностью согласен с этим.

+1

Я не думаю, что бокс применяется здесь, потому что OP просит о том, чтобы объект объекта был объектом, а не объектом. –

2

Как правило, стоимость литья объекта на основе adhoc невелика в большом масштабе вещей. Однако, если вы многократно набрасываете объекты много раз, то тогда вам следует попытаться избежать этого, если вы обнаружите, что это является причиной проблемы с производительностью.

В конце концов, одна из главных улучшений от .NET 1.1 до 2.0 было введение дженериков - это был рассмотрен вопрос о сильно типизированных списков объектов (например, ArrayList = на основе объекта, List = напечатал список)

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