Тип dynamic появился в C# 4 версии. Компилятор не выполняет у него проверку типов при компиляции. Также во время работы у такой переменной можно менять тип.
Давайте рассмотрим простой пример работы с типом dynamic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; namespace dynamicTest { class Program { static void Main(string[] args) { dynamic a = 5; Console.WriteLine(a.GetType()); // Выведет System.Int32 a += 12; Console.WriteLine(a); // Выведет 17 a = "progtask.ru"; Console.WriteLine(a.GetType()); // Выведет System.Sting Console.ReadKey(); } } } |
Как видите, мы имеем возможность изменять тип во время выполнения, а также изменять значения.
В чём отличие dynamic от object?
Давайте рассмотрим следующий программный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; namespace dynamicTest { class Program { static void Main(string[] args) { dynamic a = "Vasya"; Console.WriteLine(a.GetType()); // Выведет System.String object b = "Vasya"; Console.WriteLine(b.GetType()); // Выведет System.String a = 5; Console.WriteLine(a.GetType()); // Выведет System.Int32 b = 10; Console.WriteLine(b.GetType()); // Выведет тоже System.Int32 a += 3; // Переменная "a" теперь равна 8 Console.WriteLine(a); // Выведет 8 b += 2; // Данный код не выполнится, т.к. object по умолчанию не поддерживает арифметические операции. Console.WriteLine(b); // Данная строчка не выполнится Console.ReadKey(); } } } |
Как видите, мы не можем изменять содержащееся значение, если работаем с object, а тип dynamic это позволяет.
В чём отличие dynamic от var?
И опять начнём с кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; namespace dynamicTest { class Program { static void Main(string[] args) { dynamic a = 5; Console.WriteLine(a.GetType()); // System.Int32 var b = 9; Console.WriteLine(b.GetType()); // System.Int32 a += 3; Console.WriteLine(a); // 8 b += 3; Console.WriteLine(b); // 12 a = "Hello"; b = "Hello"; // Тут возникнет ошибка, так как у переменной "b" уже имеется фиксированный тип Console.ReadKey(); } } } |
Как мы видим, в отличие от Object мы можем изменять значение в переменной, описанной при помощи var, но не можем изменить тип во время работы программы.
Это происходит из-за того, что компилятор должен явно определить тип такой переменной во время компиляции.
К примеру, данный код также не сработает, так как переменная объявлена, но не проинициализирована:
1 2 3 4 5 6 7 8 9 10 11 12 |
using System; namespace dynamicTest { class Program { static void Main(string[] args) { var a; // Не выполнится } } } |
Вопросы задавайте в комментарии.