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

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

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

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


person John B    schedule 26.10.2009    source источник


Ответы (5)


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

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

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

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

person Marc Gravell    schedule 26.10.2009

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

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

person SoftMemes    schedule 26.10.2009

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

person Thomas Levesque    schedule 26.10.2009

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

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

person Alexandra Rusina    schedule 28.10.2009

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

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

Изменить

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

person John Fisher    schedule 26.10.2009