Язык программирования C#9 и платформа .NET5
Шрифт:
На заметку! Хотя большая часть функциональных средств среды DLR была перенесена в .NET Core (начиная с версии 3.0), паритет в плане функциональности между DLR в .NET Core 5 и .NET 4.8 так и не был достигнут.
Если у вас есть опыт работы со строго типизированными языками (включая C# без динамических типов), тогда идея такой исполняющей среды может показаться неподходящей. В конце концов, вы обычно хотите выявлять ошибки на этапе компиляции, а не во время выполнения, когда только возможно. Тем не менее, динамические языки и исполняющие среды предлагают ряд интересных средств, включая перечисленные ниже.
• Чрезвычайно гибкая кодовая база. Можно проводить рефакторинг кода, не внося многочисленных изменений в типы данных.
• Простой способ взаимодействия
• Способ добавления или удаления членов типа в памяти во время выполнения.
Одна из задач среды DLR заключается в том, чтобы позволить различным динамическим языкам работать с исполняющей средой .NET Core и предоставлять им возможность взаимодействия с другим кодом .NET Core. Двумя популярными динамическими языками, которые используют DLR, являются IronPython и IronRuby. Указанные языки находятся в "динамической вселенной", где типы определяются целиком во время выполнения. К тому же данные языки имеют доступ ко всему богатству библиотек базовых классов .NET Core. А еще лучше то, что благодаря наличию ключевого слова dynamic их кодовые базы могут взаимодействовать с языком C# (и наоборот).
На заметку! В настоящей главе вопросы применения среды DLR для интеграции с динамическими языками не обсуждаются.
Роль деревьев выражений
Для описания динамического вызова в нейтральных терминах среда DLR использует деревья выражений. Например, взгляните на следующий код С#:
В приведенном выше примере среда DLR автоматически построит дерево выражения, которое по существу гласит: "Вызвать метод по имени
Далее запрос отображается на необходимую структуру вызовов для целевого объекта. Деревья выражений обладают одной замечательной характеристикой (помимо того, что их не приходится создавать вручную): они позволяют писать фиксированный оператор кода C# и не беспокоиться о том, какой будет действительная цель.
Динамический поиск в деревьях выражений во время выполнения
Как уже объяснялось, среда DLR будет передавать деревья выражений целевому объекту; тем не менее, на этот процесс отправки влияет несколько факторов. Если динамический тип данных указывает в памяти на объект СОМ, то дерево выражения отправляется реализации низкоуровневого интерфейса СОМ по имени
Если динамические данные не указывают на объект СОМ, тогда дерево выражения может быть передано объекту, реализующему интерфейс
Наконец, если динамические данные указывают на объект, который не является объектом СОМ и не реализует интерфейс
После того как дерево выражения обработано определенным связывателем, динамические данные преобразуются в реальный тип данных в памяти, после чего вызывается
корректный метод со всеми необходимыми параметрами. Теперь давайте рассмотрим несколько практических применений DLR, начав с упрощения вызовов .NET Core с поздним связыванием.Упрощение вызовов с поздним связыванием посредством динамических типов
Одним из случаев, когда имеет смысл использовать ключевое слово
В то время как приведенный код функционирует ожидаемым образом, нельзя не отметить его некоторую громоздкость. Вы должны вручную работать с классом
За счет объявления переменной
Использование ключевого слова dynamic для передачи аргументов
Полезность среды DLR становится еще более очевидной, когда нужно выполнять вызовы методов с поздним связыванием, которые принимают параметры. В случае применения "многословных" обращений к рефлексии аргументы нуждаются в упаковке внутрь массива экземпляров