Применение ключевого слова dynamic
40C# --- Сборки .NET --- Применение ключевого слова dynamic
Вспомните, что неявно типизированные данные возможны только для локальных переменных в области определения члена. Ключевое слово 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. Всегда можно получить тот же конечный результат, написав альтернативный код вручную (обычно существенно большего объема).