Ключевое слово dynamic предназначено для * только * использования с динамическими языками? - PullRequest
4 голосов
/ 26 октября 2009

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

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

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

Ответы [ 5 ]

7 голосов
/ 26 октября 2009

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

  • вызов общих методов (MakeGenericMethod и т. Д. Просто так больно)
  • звонящие операторы

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

Недостатком dynamic является то, что для того, чтобы быть полезным (без написания безумного кода), вы должны знать имена во время компиляции; что часто не так, иначе нас бы не было в этом рассоле! Если вы знаете только имя во время выполнения, есть другие варианты (Expression, Delegate.CreateDelegate, «HyperDescriptor», DynamicMethod и т. Д.) Быстрого доступа к данным.

4 голосов
/ 26 октября 2009

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

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

2 голосов
/ 28 октября 2009

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

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

2 голосов
/ 26 октября 2009

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

1 голос
/ 26 октября 2009

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

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

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

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

...