English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#4.0 (NET 4.5) ввел новый тип dynamic, который избегает проверки типов во время компиляции. Тип dynamic пропускает проверку типов во время компиляции; вместо этого он анализирует типы во время выполнения.
Переменные динамического типа определяются с помощью ключевого слова dynamic.
dynamic MyDynamicVar = 1;
В большинстве случаев компилятор будет компилировать динамический тип в тип объекта. Однако фактический тип переменной динамического типа будет определяться в время выполнения.
dynamic MyDynamicVar = 1; Console.WriteLine(MyDynamicVar.GetType());
System.Int32
Типы динамического типа изменяются в время выполнения в зависимости от значения, назначенного. Следующий пример показывает, как переменные динамического типа изменяются в зависимости от значения, назначенного.
static void Main(string[] args) {} dynamic MyDynamicVar = 100; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); MyDynamicVar = "Hello World!!"; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); MyDynamicVar = true; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); MyDynamicVar = DateTime.Now; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); {}
Значение: 100, тип: System.Int32 Значение: Hello World !!, тип: System.String Значение: True, тип: System.Boolean Значение: 01-01-2014, тип: System.DateTime
Переменные динамического типа будут импlicitно преобразовываться в другие типы.
dynamic d1 = 100; int i = d1; d1 = "Hello"; string greet = d1; d1 = DateTime.Now; DateTime dt = d1;
Если объект класса назначается динамическому типу, то компилятор не будет проверять правильность методов и свойств имен динамического типа, сохраняемого в пользовательских классах. См. следующий пример.
class Program {} static void Main(string[] args) {} dynamic stud = new Student(); stud.DisplayStudentInfo(1, "Bill"); Время выполнения ошибки, без ошибки компиляции stud.DisplayStudentInfo("1"); Время выполнения ошибки, без ошибки компиляции stud.FakeMethod(); Время выполнения ошибки, без ошибки компиляции {} {} public class Student {} public void DisplayStudentInfo(int id) {} {} {}
В примере выше компилятор C# не проверяет параметры, типы параметров или их просто не существует. Он проверяет это в runtime, и если это не эффективно, он выбрасывает исключение runtime. Обратите внимание, что динамические типы не поддерживают Visual Studio IntelliSense. Обратите внимание, что динамические типы не поддерживают Visual Studio IntelliSense.
API runtime динамического языка предоставляет основную структуру для поддержки динамических типов в C#.