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

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

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

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

5 ответов

Решение

Я бы сказал "нет", но не начинайте использовать его безумно. На самом деле, 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 и динамическими языками, но это не значит, что мы должны ограничивать его этими областями. Что касается производительности: имейте это в виду, но не сосредотачивайтесь на этом, пока у вас не возникнут проблемы с производительностью. (Это одна из тех деталей более низкого уровня, которая вряд ли повлияет на выбор дизайна высокого уровня, который может нанести ущерб производительности даже до того, как вы начнете.)

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

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

Другие вопросы по тегам