Применение ключевого слова dynamic

40

Вспомните, что неявно типизированные данные возможны только для локальных переменных в области определения члена. Ключевое слово var никогда не может использоваться в качестве возвращаемого значения, параметра или члена класса/структуры. Однако это не касается ключевого слова dynamic. Например:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        // Поле типа dynamic
        private static dynamic dField;

        // Свойство
        public dynamic dproperty { get; set; }

        // Следующий метод возвращает тип dynamic
        public static dynamic dMethod(dynamic varriable)
        {
            dynamic dVar = "Hello";
            int i = 10;
            if (varriable is string)
            {
                return dVar;
            }
            else
            {
                return i;
            }
        }

        static void Main()
        {
        }
    }
}

Теперь можно вызывать общедоступные члены, как ожидалось, однако, при оперировании с динамическими методами и свойствами нет полной уверенности в том, каким именно будет тип данных! По правде говоря, определение Program может оказаться не особенно полезным в реальном приложении, но оно иллюстрирует область применения ключевого слова dynamic.

Ограничения ключевого слова dynamic

Хотя с использованием ключевого слова dynamic можно определить очень много вещей, с ним связаны свои ограничения. Хотя они не так уж существенны, имейте в виду, что элементы динамических данных не могут использовать лямбда-выражения или анонимные методы C# при вызове метода. Например, следующий код всегда приводит к ошибке, даже если целевой метод на самом деле принимает параметр-делегат, который, в свою очередь, принимает значение string и возвращает void:

dynamic а = GetDynamicObject () \;
// Ошибка! Методы на динамических данных не могут использовать лямбда-выражения
a.Method(arg => Console.WriteLine(arg));

Чтобы обойти это ограничение, понадобится работать с лежащим в основе делегатом напрямую. Другое ограничение состоит в том, что динамический элемент данных не может воспринимать расширяющие методы. К сожалению, это касается также всех расширяющих методов из API-интерфейсов LINQ. Поэтому переменная, объявленная с ключевым словом dynamic, имеет очень ограниченное применение в рамках LINQ to Objects и других технологий LINQ.

Практическое применение ключевого слова dynamic

Учитывая тот факт, что динамические данные не являются строго типизированными, не проверяются во время компиляции, не имеют возможности инициировать средство IntelliSense и не могут быть целью запроса LINQ, совершенно корректно предположить, что использование ключевого слова dynamic только потому, что оно существует — это очень плохая программистская практика.

Однако в редких случаях ключевое слово dynamic может радикально сократить объем кода, который придется вводить вручную. В частности, при построении приложения .NET, которое интенсивно использует позднее связывание (через рефлексию), ключевое слово dynamic может сэкономить время на наборе кода. Точно также, при разработке приложения .NET, которое должно взаимодействовать с унаследованными библиотеками СОМ (такими как продукты Microsoft Office), можно значительно упростить код за счет применения ключевого слова dynamic.

Как с любым "сокращением", прежде чем его применять, необходимо взвесить все "за" и "против". Применение ключевого слова dynamic — это компромисс между краткостью кода и безопасностью типов. Хотя C# в основе своей является строго типизированным языком, можно выбирать, стоит ли пользоваться динамическим поведением, от вызова к вызову. Помните, что вы не обязаны применять ключевое слово dynamic. Всегда можно получить тот же конечный результат, написав альтернативный код вручную (обычно существенно большего объема).

Пройди тесты
Лучший чат для C# программистов