Что “стоимость”.NET является отражением? [дубликат]

72
задан Community 23 May 2017 в 12:09
поделиться

5 ответов

Отражение требует, чтобы большая сумма метаданных типа была загружена и затем обработана. Это может привести к большей памяти служебное и более медленное выполнение. Согласно эта модификация свойства статьи о 2.5x-3x, более медленный и вызов метода является 3.5x-4x медленнее.

Вот превосходное выделение статьи MSDN, как сделать отражение быстрее и где издержки. Я настоятельно рекомендую чтение, если Вы хотите узнать больше.

существует также элемент сложности, которую отражение может добавить к коду, который делает его существенно более сбивающим с толку и следовательно трудным работать с. Некоторые люди, как Scott Hanselman полагает, что при помощи отражения Вы часто заставляете больше проблем, чем Вы решить. Это в особенности имеет место, если Ваши команды являются главным образом младшим devs.

можно быть более обеспеченным изучением ДОЛЛАРА (Динамическое Время выполнения Языка) при необходимости в большом динамическом поведении. С новыми изменениями, прибывающими в.NET 4.0, можно хотеть видеть, можно ли включить часть ее в решение. Добавленная поддержка динамического от VB и C# делает использующий динамический код очень изящным и создающим Ваши собственные динамические объекты довольно прямой.

Удача.

РЕДАКТИРОВАНИЕ: Я сделал еще некоторый ввод по абсолютному адресу вокруг сайта Scott и нашел этот подкаст на отражении. Я не слушал его, но могло бы иметь смысл.

56
ответ дан Wai Ha Lee 24 November 2019 в 12:45
поделиться

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

, Если Вы делаете много метода - вызывают, тогда Вы можете методы кэша для введенных делегатов, использующих Delegate.CreateDelegate - это тогда делает проверку типа и т.д. только однажды (во время CreateDelegate).

, Если Вы делаете много объектной конструкции, тогда Delegate.CreateDelegate, не поможет (Вы не можете использовать ее на конструкторе) - но (в 3,5) Expression может использоваться, чтобы сделать это, снова компилируя во введенного делегата.

Так да: отражение является медленным, но можно оптимизировать его без слишком большого количества боли.

17
ответ дан Marc Gravell 24 November 2019 в 12:45
поделиться

С великой державой прибывает большая ответственность.

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

Один из очень approrpiate помещает для использования его, для МОК (Инверсия Управления) с тех пор, в зависимости от размера приложения, вероятно, обладал бы большим количеством преимуществ, чем нет.

2
ответ дан Llyle 24 November 2019 в 12:45
поделиться

Спасибо за большие ссылки и замечательные комментарии, особенно со стороны Младших Devs, которые поражают его прямо в деньги.

Для нас для наших младших разработчиков легче сделать это:

[TableName("Table")]
public class SomeDal : BaseDal
{
    [FieldName("Field")]
    public string Field
}

, а не некоторый больший impelementations DAL. Это ускоряет их здание объектов DAL при сокрытии всех внутренних работ для старших разработчиков для потрошения.

Слишком плохой LINQ не выходил ранее, я время от времени чувствую, что мы записали половину из него.

2
ответ дан Peter Mortensen 24 November 2019 в 12:45
поделиться

Одна вещь, которая может иногда кусать Вас при использовании отражения, не обновляет вызовы с помощью отражения при выполнении рефакторинга. Инструменты как resharper предложат Вам обновлять комментарии и строки при изменении имени метода таким образом, можно поймать большинство из них тот путь, но когда Вы - вызывающие методы, которые были динамично сгенерированы, или имя метода было динамично сгенерировано, Вы могли бы пропустить что-то.

единственным решением является хорошая документация и полное поблочное тестирование.

0
ответ дан jonnii 24 November 2019 в 12:45
поделиться
Другие вопросы по тегам:

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