Отражение требует, чтобы большая сумма метаданных типа была загружена и затем обработана. Это может привести к большей памяти служебное и более медленное выполнение. Согласно эта модификация свойства статьи о 2.5x-3x, более медленный и вызов метода является 3.5x-4x медленнее.
Вот превосходное выделение статьи MSDN, как сделать отражение быстрее и где издержки. Я настоятельно рекомендую чтение, если Вы хотите узнать больше.
существует также элемент сложности, которую отражение может добавить к коду, который делает его существенно более сбивающим с толку и следовательно трудным работать с. Некоторые люди, как Scott Hanselman полагает, что при помощи отражения Вы часто заставляете больше проблем, чем Вы решить. Это в особенности имеет место, если Ваши команды являются главным образом младшим devs.
можно быть более обеспеченным изучением ДОЛЛАРА (Динамическое Время выполнения Языка) при необходимости в большом динамическом поведении. С новыми изменениями, прибывающими в.NET 4.0, можно хотеть видеть, можно ли включить часть ее в решение. Добавленная поддержка динамического от VB и C# делает использующий динамический код очень изящным и создающим Ваши собственные динамические объекты довольно прямой.
Удача.
РЕДАКТИРОВАНИЕ: Я сделал еще некоторый ввод по абсолютному адресу вокруг сайта Scott и нашел этот подкаст на отражении. Я не слушал его, но могло бы иметь смысл.
Существует много вещей, которые можно сделать для ускорения отражения. Например, при выполнении большого доступа свойства, тогда , HyperDescriptor мог бы быть полезным.
, Если Вы делаете много метода - вызывают, тогда Вы можете методы кэша для введенных делегатов, использующих Delegate.CreateDelegate
- это тогда делает проверку типа и т.д. только однажды (во время CreateDelegate
).
, Если Вы делаете много объектной конструкции, тогда Delegate.CreateDelegate
, не поможет (Вы не можете использовать ее на конструкторе) - но (в 3,5) Expression
может использоваться, чтобы сделать это, снова компилируя во введенного делегата.
Так да: отражение является медленным, но можно оптимизировать его без слишком большого количества боли.
С великой державой прибывает большая ответственность.
, Как Вы говорите, отражение имеет затраты, связанные с ним, и в зависимости от того, сколько отражения Вы делаете это может значительно замедлить приложение.
Один из очень approrpiate помещает для использования его, для МОК (Инверсия Управления) с тех пор, в зависимости от размера приложения, вероятно, обладал бы большим количеством преимуществ, чем нет.
Спасибо за большие ссылки и замечательные комментарии, особенно со стороны Младших Devs, которые поражают его прямо в деньги.
Для нас для наших младших разработчиков легче сделать это:
[TableName("Table")]
public class SomeDal : BaseDal
{
[FieldName("Field")]
public string Field
}
, а не некоторый больший impelementations DAL. Это ускоряет их здание объектов DAL при сокрытии всех внутренних работ для старших разработчиков для потрошения.
Слишком плохой LINQ не выходил ранее, я время от времени чувствую, что мы записали половину из него.
Одна вещь, которая может иногда кусать Вас при использовании отражения, не обновляет вызовы с помощью отражения при выполнении рефакторинга. Инструменты как resharper предложат Вам обновлять комментарии и строки при изменении имени метода таким образом, можно поймать большинство из них тот путь, но когда Вы - вызывающие методы, которые были динамично сгенерированы, или имя метода было динамично сгенерировано, Вы могли бы пропустить что-то.
единственным решением является хорошая документация и полное поблочное тестирование.