Пуристы кода будут в ужасе, но в 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);
Этот код выдаст ошибку во время компиляции; хотя myvar
myvar
1
Динамический тип, представленный в C # 4.0, несколько отличается:
// C# code
dynamic myvar = "Hello";
myvar += 1;
Console.WriteLine(myvar);
Компилятор не проверяет текущее состояние динамической переменной, поэтому не возникнет ошибок во время компиляции. Однако исключение будет выдано во время выполнения, поскольку 1 невозможно добавить в строку.
Динамические переменные эффективно наследуют свойства и методы, соответствующие их типу во время выполнения. Следующий код будет выполняться, потому что myvar
Length
// C# code
dynamic myvar = "Hello";
Console.WriteLine(myvar.Length);
Хотя динамические переменные обеспечивают гибкость, существует ряд рисков:
- Нет IntelliSence : компилятор не знает, каким типом динамическая переменная в конечном итоге станет, поэтому он не может предложить подсказки кода метода или свойства в Visual Studio.
- Нет ошибок во время компиляции : может использоваться несуществующее свойство или метод, например
myvar.DoesNotExist()
Ваш код по-прежнему будет компилироваться и выполняться, но при попытке вызова будет сгенерировано исключение.
Я бы предложил вам использовать только динамические типы, когда нет других альтернатив; например, при вызовах COM-объектов со свободно типизированными API-интерфейсами (хороший пример — Microsoft Office) или при вызове динамических языков, таких как Python и Ruby.