Когда Вы используете отражение? Шаблоны/антишаблоны

Хэш-код используется для коллекций на основе хэша, таких как Dictionary, Hashtable, HashSet и т. д. Цель этого кода - очень быстро предварительно сортировать конкретный объект, помещая его в определенную группу (ведро). Эта предварительная сортировка очень помогает в поиске этого объекта, когда вам нужно вернуть его из коллекции хешей, потому что код должен искать ваш объект только в одном ведро, а не во всех его объектах. Лучшее распределение хэш-кодов (лучшая уникальность) - более быстрое извлечение. В идеальной ситуации, когда каждый объект имеет уникальный хеш-код, поиск его является операцией O (1). В большинстве случаев он приближается к O (1).

30
задан George Stocker 9 January 2009 в 22:52
поделиться

15 ответов

Единственное место я использовал Отражательный материал в C#, было в шаблонах "фабрика", где я создаю объекты (в моем случае, сетевых слушателях) на основе информации о конфигурационном файле. Конфигурационный файл предоставил местоположение блоков, название типов в них и любые дополнительные необходимые аргументы. Фабрика взяла этот материал и создала слушателей на основе этого.

28
ответ дан Harper Shelby 11 October 2019 в 12:40
поделиться

Я пошел в течение 2 лет разработки, не понимая цели отражения. Это имеет очень нишевое использование, но чрезвычайно мощно, когда это - правильный инструмент для задания.

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

1
ответ дан Garry Shutler 11 October 2019 в 12:40
поделиться

Я использую его в случае, подобном упомянутому Harper Shelby, в котором конфигурационный файл определяет во времени выполнения, которые возражают для инстанцирования. В моем особом случае нет ничего столь же тщательно продуманного как фабрика - только ряд классов, которые реализуют единый интерфейс и простую функцию, которая читает конфигурационный файл и создает надлежащий объект, возвращая интерфейс.

1
ответ дан JSBձոգչ 11 October 2019 в 12:40
поделиться

Я использую его в двоичном сериализаторе ( protobuf-сеть ). Я использую отражение только для создания модели - когда это используется (т.е. во время [de] сериализации), это использует делегатов и т.д. к максимальной производительности.

я также использовал его (наряду с ComponentModel и Отражением. Испустите) в HyperDescriptor, для создания ускоренного доступа свойства (~100x скорость регулярного отражения).

И при необходимости, необходимо использовать отражение, если Вы здание Ваше собственное Expression s.

3
ответ дан Marc Gravell 11 October 2019 в 12:40
поделиться

Я не собираюсь отбросить любые шаблоны, но я предположил бы, что это - хорошая идея избежать отражения, пока Вам на самом деле не нужен он. Для interop и ситуаций с расширяемостью особенно полезно, где Вы не можете управлять загодя типом объекта.

3
ответ дан Randolpho 11 October 2019 в 12:40
поделиться

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

8
ответ дан Andru Luvisi 11 October 2019 в 12:40
поделиться

Я нахожу отражение (объединенным с загрузкой класса среды выполнения) необходимый для реализации плагинов:

  1. поиск банок / блоки в известном месте
  2. перечисляют банки / блоки для классов, поддерживающих интерфейс, Ваши сменные поддержки
  3. инстанцируют плагина во времени выполнения
6
ответ дан JeffV 11 October 2019 в 12:40
поделиться

Я использовал отражение во многих местах. Основные широкие категории включают:

  1. Автоматически сгенерированные графический интерфейсы пользователя (т.е., редактор свойств). Можно циклично выполниться по свойствам объекта и использовать реестр фабрик элемента UI для создания формы. Я использую атрибуты на свойствах для руководства создания UI.
  2. Сериализация . Я записал платформам сериализации отражение использования, чтобы сериализировать и десериализовать объекты.
  3. веб-сервисы . Подобный сериализации, я использовал отражение, чтобы создать и использовать сообщения SOAP и также генерировать WSDL.
  4. Предметно-ориентированные языки . Интерпретируемые языки сценариев будут обычно связывать с объектами и методами с помощью отражения.
  5. Средства отладки . Такие инструменты могут использовать отражение для исследования состояния объекта. Удобный для создания журнала обменивается сообщениями в состоянии отказа.

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

Используя отражение мощно, но оно привычка делает Вас более популярными на вечеринках. Только используйте его, где связь намеренно слаба. Столь слабый, что Вы ожидаете, что он повредится во времени выполнения. Яркий пример является привязкой данных в WPF.

я не уверен в антишаблонах, но конечно это коснулось бы выполнения вещей во времени выполнения, которое должно быть сделано во время компиляции...

9
ответ дан Daniel Paull 11 October 2019 в 12:40
поделиться

В одном продукте я продолжаю работать, мы используем его много, но Отражение является комплексом, медленным зверем. Не идите, ища места для использования его просто, потому что это звучит как забава или интересный. Вы будете использовать его при столкновении с проблемой, которая не может быть решена никаким другим способом (динамично загружающий блоки для разъема ins или платформ, контроля блока, фабрики, где типы не, знают в сборке, и т.д.). Конечно, стоит посмотреть на отражательные учебные руководства, чтобы видеть, как это работает, но не попадайте в прерывание "наличия молотка и всего бывшего похожего на гвоздь". Это получено очень специализированные варианты использования.

32
ответ дан ctacke 11 October 2019 в 12:40
поделиться

Я использую отражение изрядное количество в моих модульных тестах, особенно когда вещами, которые я проверяю, являются анонимные типы. Я также использовал его в качестве способа легко клонироваться/копировать объекты модели. Вместо того, чтобы писать код, чтобы сделать это для каждого объекта модели, я могу легко создать объект конкретного типа с помощью отражения, опросить общественные собственности входящего объекта и вызвать методы set на клонированные объекты соответствующие свойства. Я также использую его со сгенерированными классами разработчика, которые реализуют те же сигнатуры методов, но не имеют связанного интерфейса. В тех случаях я могу опросить объект видеть, имеет ли он требуемый метод, и вызовите его, если он делает. Объекты LINQ2SQL похожи на это так в моей поддельной обертке контекста данных метод OnSubmit, я использую отражение, чтобы получить метод OnValidate и вызвать его для поблочного тестирования.

2
ответ дан tvanfosson 11 October 2019 в 12:40
поделиться

+1 на использовании шаблона "фабрика" - очень мощный там.

Кроме шаблона "фабрика", каждый раз, когда я использовал его, я, вероятно, не должен иметь...

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

антишаблон должен использовать его свойства доступа, которые разработчики класса отметили как частные, не зная, почему они отметили их как частных. Я сделал это с управлением DataGridView WinForms для сбрасывания логической переменной, таким образом, у меня могло быть "сопутствующее" перемещение столбца, когда его дополнение было перемещено. Еще раз это очень прохладно, но тот код перестанет работать ужасно, если новый выпуск изменит ту частную собственность (это очень хорошо могло бы закончиться в 3,0 или 3.5...).

2
ответ дан Austin Salonen 11 October 2019 в 12:40
поделиться

Я не знаю, является ли это шаблон, но я использую отражение для генерации SQL от определений классов ДАО.

11
ответ дан Otávio Décio 11 October 2019 в 12:40
поделиться

Отражение позволяет Вам решать проблемы, которые иначе потребовали бы Вас к дублирующему коду. Если Вы копируете и вставить код и не видите, как шаблон OO может помочь, возможно, если можно назвать их, то "r команда" может помочь.

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

Говорят, что у Вас есть много объектов GUI как объектов 'таблицы' или Формы. Это связывает с бизнес-объектом как Клиент:

public class Customer
{
   public string FirstName;
   public string LastName;

}

Ваши пользователи не хотят видеть заголовки столбцов 'FirstName' или 'LastName'. Они хотят 'имя' и Фамилию. Вы не хотите кодировать литеральные строки во всех своих объектах GUI в случае, если они передумали к 'Имени' и 'Фамилии родительского элемента' (я знаю, загаженный пример).

, Если Вы определяете свой класс с помощью атрибутов:

public class Customer
{
   [Description("Christian Name")]
   public string FirstName;

   [Description("Surname")]
   public string LastName;

}

можно использовать отражение для вытаскивания имен столбцов. Если необходимо изменить путь весь объекты GUI описывают потребительский объект, Вы теперь делаете это в одном месте.

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

0
ответ дан Jimmy McNulty 11 October 2019 в 12:40
поделиться

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

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

Вместо этого я храню отражательную строку в DB, который говорит классу "создавать один из них..." Так как я (программист) всегда удостоверяюсь, что класс получен из единственного базового класса, работ идеи. Это чисто и эффективно.

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

(вводят речь мудрого, старого мудреца)
Отражение идет с невероятным питанием... используют питание с мудростью.

1
ответ дан Jerry 11 October 2019 в 12:40
поделиться

Я чаще всего использую его, когда я должен повредить чей-либо (обычно платформа) инкапсуляция. Таким образом, я должен изменить некоторое частное поле, или назвать закрытый метод или создать экземпляр некоторого внутреннего класса в библиотеке, которую я не имею никакого права изменять. Хорошим примером является код в мой ответ к этот вопрос . В этом случае поведение метода платформы ServiceBase.Run было недопустимо, таким образом, я использовал отражение, чтобы сделать то же самое, это делает более приемлемым способом.

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

0
ответ дан Community 11 October 2019 в 12:40
поделиться
Другие вопросы по тегам:

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