Недавно я больше изучал динамические типы в C #. С некоторыми примерами, которые я понял после компиляции кода, его не нужно перекомпилировать снова, но можно выполнить напрямую.
Я чувствую, что гибкость, обеспечиваемая ключевым словом для возможности изменять тип данных по своему желанию, является большим преимуществом .
Вопрос,
Существуют ли какие- либо конкретные недостатки, кроме неправильных вызовов динамических методов, которые генерируют исключения во время выполнения, которые разработчики должны знать перед началом реализации.
c#
.net
visual-studio-2010
Картик Сринивасан
источник
источник
object
или непосредственное приведение типов кодовым запахом. Почти в каждом случае это означало, что я или кто-то из моей команды не разработали соответствующий интерфейс для этой функции. Я предполагаю, что если бы я использовал C # 4 сейчас, я чувствовал бы то же самое и с использованиемdynamic
тоже. Я мог бы это доказать, если вы сделаете все динамически, но в этом случае вы могли бы также выбрать динамический типизированный язык в первую очередь. * 8 ')dynamic
в C # означает, что вам не нужно выходить в IronPython, если все, что вам нужно, это динамическая типизация для небольшой части вашего кода. Что касается оценщика выражений, я с большим успехом использовалdynamic
представление операндов выражения и результатов вычисления.dynamic
, плюс я хотел бы знать о IronPython, когда я разрабатывал с .Net - это могло бы сделать некоторые вещи, которые мы пытались сделать, намного проще.Ответы:
Основным недостатком является то, что вы отбрасываете одно из основных свойств (не обязательно преимуществ) C # - то, что оно статически типизировано (и для большей части типа безопасно).
Проблема с динамической типизацией заключается в том, что она часто скрывает ошибки, которые иначе были бы обнаружены во время компиляции. Такая ошибка в этом случае проявляется только во время выполнения, что, конечно, затрудняет ее обнаружение.
В IMO очень мало причин использовать динамическую типизацию в C #, основной из которых является совместная работа с динамически типизированными языками (это AFAIK, причина, по которой динамический тип был введен в первую очередь).
Если вы хотите заниматься программированием с полной динамической типизацией, вам следует взглянуть на некоторый язык, который предназначен для динамического программирования, а не для взлома C # на динамический. Вы можете использовать, например, IronPython, если вы хотите использовать библиотеки .Net
источник
dynamic
дает вам - это возможность привести объект к его реальному типу без какого-либо отражения взлома. Например, еслиBase foo = new Derived();
и было два перегруженных методаMoo(Base x)
иMoo(Derived x)
, тоMoo(foo)
вызовыMoo(Base x)
, ноMoo((dynamic)foo)
вызовыMoo(Derived x)
. Это приводит к очень элегантной реализации шаблона Visitor, например: code.logos.com/blog/2010/03/…, и в целом является очень мощным методом.Я не уверен, какие недостатки вы ищете, но если вы хотите узнать о функциях, которые работают со статической типизацией, но не с
dynamic
, есть несколько:Методы расширения не работают. Это, наверное, самый большой. Если у вас есть
dynamic collection
, вы не можете использовать код, какcollection.Distinct()
. Это потому, что доступные методы расширения зависят от пространства имен,using
а DLR не может их узнать.В качестве обходного пути, вы можете вызвать метод , как если бы это был нормальный статический метод:
Enumerable.Distinct(collection)
. Или вы можете изменить тип коллекции на что-то вродеIEnumerable<dynamic>
.foreach
требуетIEnumerable
. В обычном C #foreach
основывается на шаблонах. То есть, он не требует какого-либо определенного интерфейса, толькоGetEnumerator()
метод, который возвращает подходящий объект. Если вы используетеforeach
наdynamic
, реализацииIEnumerable
требуется. Но поскольку причиной такого поведения является то, что в C # 1.0 не было обобщений, этот «недостаток» в значительной степени не имеет значения.источник
Проблема с динамическими типами (не переменными, объявленными как динамические) в .net заключается в том, что они не обладают достаточной функциональностью, доступной статическим типам.
Поэтому не пишите код с динамическими типами, если вы не знаете, что делаете.
источник
Так как
dynamic
это просто помеченные вobject
нем поля значений типов.Это может повлиять на производительность, но, поскольку в любом случае я бы использовал статическую типизацию в критичном для производительности коде, на практике это, вероятно, не проблема.
Этот бокс также мешает изменяемым типам значений. Если вы изменяете их
dynamic
, вы изменяете только коробочную копию. Но поскольку вы не должны использовать изменяемые типы значений в первую очередь, это тоже не большая проблема.источник