Предназначено ли ключевое слово dynamic для использования * только * с динамическими языками?

StackOverflow https://stackoverflow.com/questions/1624951

Вопрос

Недавно я посетил Code Camp 12, и один из выступавших там сказал, что новый dynamic ключевое слово в C # 4.0 следует может использоваться только для взаимодействия с динамическими языками.Я думаю, он также сказал, что это несколько замедленно по сравнению с обычным отражением (которое само по себе несколько замедленное).

Но потом я услышал, как Скотт Хансельман упомянул, что ключевое слово dynamic "делает размышления менее болезненными".

Итак, будет ли приемлемо использовать ключевое слово dynamic с целью отражения объекта, который не взят из динамического кода?

Это было полезно?

Решение

Я бы сказал "нет", но не начинайте использовать это безумно.На самом деле, dynamic это, судя по тому, что я провел сравнительный анализ, быстрее чем базовое отражение, поскольку оно сохраняет делегаты (а не использует отражение Invoke все время).В частности, двумя сильными сторонами являются:

  • вызов универсальных методов (MakeGenericMethod и т.д. - это просто так больно)
  • вызывающие операторы

Однако существуют способы использования того, что вам нужно, с помощью интерфейсов и т. Д; dynamic для нединамического типа это действительно равносильно вводу текста уткой.Это полезно в очень ограниченный набор сценариев;в основном:интерфейсы были бы предпочтительнее.Не стоит их исключать.

Обратная сторона dynamic это значит, что для того, чтобы быть полезным (без написания безумного кода), вам нужно знать имена во время компиляции;что часто бывает не так, иначе мы бы не оказались в таком затруднительном положении!Когда вы знаете имя только во время выполнения, есть и другие варианты (Expression, Delegate.CreateDelegate, "ГиперДескриптор", DynamicMethod, и т.д.) быстрого доступа к данным.

Другие советы

Если вы чувствуете, что нуждаетесь в типизированном наборе символов и не нуждаетесь в безопасности времени компиляции, продолжайте и используйте динамический. Я уверен, что в коде только на C # появится несколько новых способов его использования (например, запрос динамического источника данных, такого как XML, с помощью ExpandoObject). Я так же уверен, что большое количество новых использований будет излишним, так же как и использование дженериков - просто более сложный способ выражения полиморфизма.

Что касается производительности, DLR в .NET 4 пытается сделать динамическую типизацию "быстрой". Как всегда, если это достаточно быстро, вы поймете это, когда начнете профилировать свое приложение.

Из того, что я знаю, основная причина, по которой ключевое слово dynamic было введено в C #, заключалась в том, чтобы упростить взаимодействие с COM-объектами. Но, конечно, его можно использовать для размышлений ...

Ответ таков: ключевое слово dynamic предназначено для взаимодействия, а не только для взаимодействия динамических языков. COM-взаимодействие - это только один пример. Команда C # уже изменила COM-взаимодействие, чтобы использовать эту функцию, и это значительно упростило взаимодействие. Недавно я видел, что ASP.NET MVC Views делают нечто подобное.

Я также опубликовал пример, в котором показан другой вариант использования динамического ключевого слова: Dynamic в C # 4.0: создание оболочек с помощью DynamicObject . Это именно те примеры, о которых говорил Фрид: упрощение взаимодействия с данными XML.

Я должен был бы сказать "Нет".Взгляните на http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx приведу пример менее ожидаемого использования.

Ключевое слово dynamic явно предназначалось для того, чтобы упростить работу с COM и динамическими языками, но это не значит, что мы должны ограничивать его этими областями.Что касается производительности:имейте это в виду, но не зацикливайтесь на нем до тех пор, пока у вас не возникнут проблемы с производительностью.(Это одна из тех деталей более низкого уровня, которая вряд ли повлияет на выбор высокоуровневого дизайна, который может снизить производительность еще до того, как вы начнете.)

Редактировать

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top