Статьи

Как использовать динамические типы в C # 4.0

Пуристы кода будут в ужасе, но в C # 4.0 появились динамические типы. В таких языках, как PHP и JavaScript, переменные свободно набираются; нет необходимости объявлять, какой тип данных будет содержать переменная, поэтому нет ограничений на операторы или методы, которые вы можете использовать, например:


// JavaScript code
var myvar = "Hello";
myvar += 1;
alert(myvar); // outputs "Hello1"

C # и VisualBasic.NET строго типизированы; однако оба они предлагают общий тип object

 
// C# code
object myvar = "Hello";
myvar += 1;
Console.WriteLine(myvar);

Этот код выдаст ошибку во время компиляции; хотя myvarmyvar1

Динамический тип, представленный в C # 4.0, несколько отличается:

 
// C# code
dynamic myvar = "Hello";
myvar += 1;
Console.WriteLine(myvar);

Компилятор не проверяет текущее состояние динамической переменной, поэтому не возникнет ошибок во время компиляции. Однако исключение будет выдано во время выполнения, поскольку 1 невозможно добавить в строку.

Динамические переменные эффективно наследуют свойства и методы, соответствующие их типу во время выполнения. Следующий код будет выполняться, потому что myvarLength

 
// C# code
dynamic myvar = "Hello";
Console.WriteLine(myvar.Length);

Хотя динамические переменные обеспечивают гибкость, существует ряд рисков:

  1. Нет IntelliSence : компилятор не знает, каким типом динамическая переменная в конечном итоге станет, поэтому он не может предложить подсказки кода метода или свойства в Visual Studio.
  2. Нет ошибок во время компиляции : может использоваться несуществующее свойство или метод, например myvar.DoesNotExist() Ваш код по-прежнему будет компилироваться и выполняться, но при попытке вызова будет сгенерировано исключение.

Я бы предложил вам использовать только динамические типы, когда нет других альтернатив; например, при вызовах COM-объектов со свободно типизированными API-интерфейсами (хороший пример — Microsoft Office) или при вызове динамических языков, таких как Python и Ruby.