dynamic != magic Александр Ложкин ГК Экстрим
План доклада 1) 2) 3) 4) 5) dynamic keyword; metadata; пара слов о DLR; dynamic vs reflection; примеры использования; 2
dynamic keyword 3
dynamic keyword 4
dynamic keyword 5
dynamic keyword object -> System. Object int -> System. Int 32 dynamic -> System. Dynamic… а вот и нет dynamic = System. Object + метаданные. dynamic – ключевое слово для компилятора: • указывает на необходимость сгенерировать код для взаимодействия с DLR; • скрывает цель/результат вызова от компилятора, т. е. указывает на необходимость отложить компиляцию до runtime. 6
dynamic metadata 7
dynamic metadata 8
dynamic metadata 9
DLR 10
DLR 11
dynamic vs reflection 12
dynamic vs reflection 13
dynamic vs reflection • Плюсы dynamic: • понятный код, проще поддерживать; • поддержка со стороны средств разработки; • возможность использовать все средства языка в «естественной» форме; • выше производительность. • Минусы dynamic: • нельзя нарушать области видимости; • не подходит для «исследования» объектов и типов. 14
Пример #1 Работа с конфигурацией 15
Пример #2 Анонимные классы 16
Пример #3 Работа со «сторонним» кодом 17
Пример #4 Multiple dispatch Задача: выбрать метод (во время выполнения) среди перегрузок в зависимости от типа аргумента. Варианты решения: • type-switch (if-else-if-else); • словарь «тип-делегат» ; • рефлексия; • каноничный посетитель (Accept и Visit). 18
Пример #4 Multiple dispatch 19
Пример #4 Multiple dispatch 20
Пример #4 Multiple dispatch 21
Заключение • • • C# по прежнему строго типизированный язык; главный плюс dynamic – унификация и скрытие типа объекта; dynamic позволяет писать более эффективный код; dynamic производительней и понятнее рефлексии; dynamic следует использовать осторожно; используйте dynamic для реализации паттернов динамически типизированных языков. 22
Благодарю за внимание! Контакты: syberside@gmail. com, @syberside Исходники: github. com/syberside/Dynamic. Is. Not. Magic Вопросы, комментарии… помидоры?