Когда следует использовать динамическое ключевое слово в c # 4.0?

Когда нужно использовать динамическое ключевое слово в c # 4.0? ……. Хороший пример с динамическим ключевым словом в c # 4.0, который объясняет его использование ….

7 Solutions collect form web for “Когда следует использовать динамическое ключевое слово в c # 4.0?”

Динамический должен использоваться только тогда, когда его использование не является болезненным . Как в библиотеках MS Office. Во всех остальных случаях его следует избегать, так как проверка типа компиляции выгодна. Ниже приведена хорошая ситуация с динамикой.

  1. Вызов метода javascript из Silverlight.
  2. COM interop.
  3. Возможно, чтение Xml, Json без создания пользовательских classов.

Как насчет этого? Что-то я искал и задавался вопросом, почему так трудно обойтись без «динамического».

interface ISomeData {} class SomeActualData : ISomeData {} class SomeOtherData : ISomeData {} interface ISomeInterface { void DoSomething(ISomeData data); } class SomeImplementation : ISomeInterface { public void DoSomething(ISomeData data) { dynamic specificData = data; HandleThis( specificData ); } private void HandleThis(SomeActualData data) { /* ... */ } private void HandleThis(SomeOtherData data) { /* ... */ } } 

Вам просто нужно уловить исключение Runtime и обработать, как вы хотите, если у вас нет перегруженного метода, который принимает конкретный тип.

Эквивалентом использования dynamic будет:

  public void DoSomething(ISomeData data) { if(data is SomeActualData) HandleThis( (SomeActualData) data); else if(data is SomeOtherData) HandleThis( (SomeOtherData) data); ... else throw new SomeRuntimeException(); } 

Как описано здесь, динамика может упростить использование слабоструктурированных внешних библиотек: Microsoft предоставляет пример сборки Microsoft.Office.Interop.Excel. И с динамикой вы можете избежать много раздражающего, явного литья при использовании этой сборки.

Кроме того, в отличие от @ user2415376, это определенно не способ обрабатывать интерфейсы, поскольку мы уже имеем Полиморфизм, реализованный с первых дней существования языка!
Вы можете использовать

  ISomeData specificData = data; 

вместо

 dynamic specificData = data; 

Кроме того, он будет следить за тем, чтобы вы не передавали неправильный тип объекта данных.

Проверьте это сообщение в блоге, в котором говорится о динамических ключевых словах в c #. Вот суть:

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

Рассмотрим недостатки:

  1. Нет проверки типа компиляции, это означает, что, если у вас нет 100% -ной уверенности в ваших модульных тестах (кашель), вы рискуете.

  2. Динамическое ключевое слово использует больше циклов ЦП, чем старый старомодный статически типизированный код из-за дополнительных накладных расходов во время выполнения, если производительность важна для вашего проекта (обычно это), не использует динамический.

  3. Общие ошибки include возrotation анонимных типов, завернутых в ключевое слово dynamic в общедоступных методах. Анонимные типы специфичны для сборки, возвращая их через сборку (через общедоступные методы), выдаст ошибку, хотя простое тестирование поймает это, теперь у вас есть общеansible метод, который можно использовать только из определенных мест, и это просто плохой дизайн ,

  4. Это скользкий склон, неопытные разработчики жаждут писать что-то новое и стараются изо всех сил избегать большего количества classов (это не обязательно ограничивается неопытным) начнут использовать динамику все больше и больше, если они видят ее в коде, обычно я бы делал код анализ проверки на динамику / добавление его в обзор кода.

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

Я хотел бы скопировать выдержку из сообщения проекта кода, которые определяют, что:

Зачем использовать динамический?

В статично типизированном мире динамика дает разработчикам много веревки, чтобы повесить себя. При работе с объектами, типы которых могут быть известны во время компиляции, вы должны избегать динамического ключевого слова любой ценой. Раньше я говорил, что моя первоначальная реакция была отрицательной, и что изменило мое мнение? По словам Маргрет Этвуд, контекст – это все. При статической типизации динамика не создает никакого смысла. Если вы имеете дело с неизвестным или динамическим типом, часто приходится общаться с ним через Reflection. Светоотражающий код читать нелегко и имеет все недостатки динамического типа выше. В этом контексте динамика имеет большой смысл. [Подробнее]

Хотя некоторые характеристики ключевого слова Dynamic:

  1. Динамически типизированный – это означает, что тип объявленной переменной определяется компилятором во время выполнения.
  2. Не нужно инициализировать во время объявления.

например,

 dynamic str; str=”I am a string”; //Works fine and compiles str=2; //Works fine and compiles 
  1. Ошибки попадают во время выполнения

  2. Intellisense недоступен, так как тип и связанные с ним методы и свойства могут быть известны только во время выполнения. [ https://www.codeproject.com/Tips/460614/Difference-between-var-and-dynamic-in-Csharp%5D

Вот недавний случай, когда использование dynamic было простым решением.

Я портировал код из VB6 на C #. Этот портированный код по-прежнему необходим для вызова других методов на объекты VB6 через COM-взаимодействие.

Классы, которые нужно называть, выглядели так:

 class A { void Foo() {...} } class B { void Foo() {...} } 

(т. е. так будет выглядеть class VB6 на C # через COM-взаимодействие, в частности, COM-вызываемую оболочку, которая была автогенерирована).

Поскольку A и B независимы друг от друга, вы не можете отбрасывать один на другой, и у них нет общего базового classа (COM не поддерживает то, что AFAIK и VB6, конечно же, не сделали. И они не реализовали общий интерфейс – Смотри ниже).

Оригинальный код VB6, который был перенесен, сделал это:

 ' Obj must be either an A or a B Sub Bar(Obj As Object) Call Obj.Foo() End Sub 

Теперь в VB6 вы можете передавать объекты как Object и время выполнения будет определять, есть ли у этих объектов метод Foo() или нет. Но в C # буквальный перевод:

 // Obj must be either an A or a B void Bar(object Obj) { Obj.Foo(); } 

Что НЕ будет работать. Он не будет компилироваться, потому что object не имеет метода под названием «Foo», а C #, являющийся typesafe, не позволит этого.

Поэтому простым «исправлением» было использование dynamic , например:

 // Obj must be either an A or a B void Bar(dynamic Obj) { Obj.Foo(); } 

Это защищает тип безопасности до времени выполнения, но при условии, что вы сделали это правильно, все работает отлично.

Я бы не одобрил это для нового кода, но в этой ситуации (что, я думаю, не редкость судить по другим ответам здесь), это было ценно.

Рассматриваемые альтернативы:

  • Использование отражения для вызова Foo (). Вероятно, это сработает, но больше усилий и менее читаемо.

  • Модификация библиотеки VB6 здесь не была, но, возможно, может быть подход для определения A и B с точки зрения общего интерфейса, который поддерживает VB6 и COM. Но использовать динамику было намного проще.


Примечание. Вероятно, это будет временное решение. В конце концов, если оставшийся код VB6 будет перенесен, тогда может быть использована соответствующая структура classов, и статическая проверка времени компиляции заменит использование dynamic . Я признаю, что такое надежное будущее сделало меня более удобным, используя этот подход, который может иметь некоторый риск обслуживания.

  • Какова цель ключевого слова var и когда я должен использовать его (или опустить)?
  • Каково ключевое слово «продолжить» и как оно работает на Java?
  • Когда использовать статическое ключевое слово перед глобальными переменными?
  • «Новое» ключевое слово в Scala
  • Есть ли инструкция goto в Java?
  • Есть ли причина использовать ключевое слово auto для C ++ 03?
  • Разница между «этими» и «супер» ключевыми словами в Java
  • Когда мы должны использовать ключевое слово extern alias в C #?
  • Interesting Posts

    CHOLMOD в Java

    Можно ли клонировать и загружать жесткий диск моего ноутбука на другой ноутбук?

    Сопряжение Sony bluetooth-наушников с моим ПК под Windows 7

    Наследование C ++ и функция переопределения

    Будет ли «пустой» конструктор или деструктор делать то же самое, что и сгенерированный?

    Excel: невероятное сокращение и расширение элементов управления

    Если клавиша клавиатуры ноутбука не работает, я должен вытащить ее и очистить ее основание?

    C для вставки текста в определенном месте в файле без перезаписи существующего текста

    как проверить токен доступа к facebook?

    Переименование многих файлов в Mac OS X, пакетная обработка

    Как изменить тип идентификатора в Microsoft.AspNet.Identity.EntityFramework.IdentityUser

    Является ли это очень важным для производительности?

    Java, как рисовать постоянно меняющуюся графику

    Как обнаружить, если я компилирую код с Visual Studio 2008?

    Загружать сразу несколько пакетов

    Давайте будем гением компьютера.