English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C#基础教程

C#高级教程

C#面向对象(OOP)

Динамические типы (Dynamic) в C#

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#.