Полное руководство по языку программирования С# 14 и платформе .NET 10 / Dynamic Language Runtime

DLR в C#. Ключевое слово dynamic

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

Хотя C# относится к статически типизированным языкам, в последних версиях языка были добавлены некоторые динамические возможности. Так, начиная с .NET 4.0 была добавлена новая функциональность под названием DLR (Dynamic Language Runtime). DLR представляет среду выполнения динамических языков, например, таких языков как IronPython и IronRuby.

Чтобы понять значение данного нововведение, нужно осознавать разичие между языками со статической и динамической типизицией. В языках со статической типизацией выявление всех типов и их членов - свойств и методов происходит на этапе компиляции. А в динамических языках системе ничего не известно о свойствах и методах типов вплоть до выполнения.

Благодаря этой среде DLR C# может создавать динамические объекты, члены которых выявляются на этапе выполнения программы, и использовать их вместе с традиционными объектами со статической типизацией.

Ключевым моментом использования DLR в C# является применение типов dynamic. Это ключевое слово позволяет опустить проверку типов во время компиляции. Кроме того, объекты, объявленные как dynamic, могут в течение работы программы менять свой тип. Например:


dynamic obj = 3;            // здесь obj - целочисленное int
Console.WriteLine(obj);     // 3

obj = "Hello world";        // obj - строка
Console.WriteLine(obj);     // Hello world

obj = new Person("Tom", 37); // obj - объект Person
Console.WriteLine(obj);      // Person { Name = Tom, Age = 37 }

record class Person(string Name, int Age);

Несмотря на то, что переменная x меняет тип своего значения несколько раз, данный код будет нормально работать. В этом использование типов dynamic отличается от применения ключевого слова var. Для переменной, объявленной с помощью ключевого слова var, тип выводится во время компиляции и затем во время выполнения больше не меняется.

Также можно найти общее между использованием dynamic и типом object. Если в предыдущем примере мы заменим dynamic на object: object x = 3;, то результат будет тот же. Однако и тут есть различия. Например:


object obj = 24;
dynamic dyn = 24;
obj += 4; // так нельзя
dyn += 4; // а так можно

На строке obj += 4; мы увидим ошибку, так как операция += не может быть применена к типам object и int. С переменной, объявленной как dynamic, это пройдет, так как ее тип будет известен только во время выполнения.

Еще одна отличительная особенность использования dynamic состоит в том, что это ключевое слово применяется не только к переменным, но и к свойствам и методам. Например:


class Person
{
    public string Name { get;}
    public dynamic Age { get; set; }
    public Person(string name, dynamic age)
    {
        Name = name; Age = age;
    }

    // выводим зарплату в зависимости от переданного формата
    public dynamic GetSalary(dynamic value, string format)
    {
        if (format == "string") return $"{value} euro";
        else if (format == "int") return value;
        else return 0.0;
    }

    public override string ToString() => $"Name: {Name}  Age: {Age}";
}

В классе Person определено динамическое свойство Age, поэтому при задании значения этому свойству мы можем написать и person.Age=22, и person.Age="twenty-two". Оба варианта будут допустимыми. А через параметр age в конструкторе этому свойству можно передать любое значение.

Также есть метод GetSalary, который возвращает значение dynamic. Например, в зависимости от параметра мы можем вернуть или строковое представление суммы дохода или численное. Также метод принимает dynamic в качестве параметра. Таким образом, мы можем передать в качестве значения дохода как целое, так и дробное число или строку. Посмотрим на конкретное применение:


dynamic tom = new Person("Tom", 22);
Console.WriteLine(tom);
Console.WriteLine(tom.GetSalary(28, "int"));

dynamic bob = new Person("Bob", "twenty-two");
Console.WriteLine(bob);
Console.WriteLine(bob.GetSalary("twenty-eight", "string"));

Консольный вывод программы:

Name: Tom  Age: 22
28
Name: Bob  Age: twenty-two
twenty-eight euro

Проверь себя

📋 Тест по теме «DLR в C#. Ключевое слово dynamic» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ obj = 3;            // здесь obj - целочисленное int
Console.WriteLine(obj);     // 3

obj = "Hello world";        // obj - строка
Console.WriteLine(obj);     // Hello world

obj = new Person("Tom", 37); // obj - объект Person
Console.WriteLine(obj);      // Person { Name = Tom, Age = 37 }

record class Person(string Name, int Age);
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ect obj = 24;
dynamic dyn = 24;
obj += 4; // так нельзя
dyn += 4; // а так можно
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Person
{
    public string Name { _____;}
    public dynamic Age { get; set; }
    public Person(string name, dynamic age)
    {
        Name = name; Age = age;
    }

    // выводим зарплату в зависимости от переданного формата
    public dynamic GetSalary(dynamic value, string format)
    {
        if (format == "string") return $"{value} euro";
        else if (format == "int") return value;
        else return 0.0;
    }

    public override string ToString() => $"Name: {Name}  Age: {Age}";
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

dynamic tom = new _____("Tom", 22);
Console.WriteLine(tom);
Console.WriteLine(tom.GetSalary(28, "int"));

dynamic bob = new Person("Bob", "twenty-two");
Console.WriteLine(bob);
Console.WriteLine(bob.GetSalary("twenty-eight", "string"));
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

dynamic obj = _____;            // здесь obj - целочисленное int
Console.WriteLine(obj);     // 3

obj = "Hello world";        // obj - строка
Console.WriteLine(obj);     // Hello world

obj = new Person("Tom", 37); // obj - объект Person
Console.WriteLine(obj);      // Person { Name = Tom, Age = 37 }

record class Person(string Name, int Age);
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

dynamic _____ = 3;            // здесь obj - целочисленное int
Console.WriteLine(obj);     // 3

obj = "Hello _____";        // obj - строка
Console.WriteLine(obj);     // Hello world

obj = new Person("Tom", 37); // obj - объект Person
Console.WriteLine(obj);      // Person { Name = Tom, Age = 37 }

record class Person(string Name, int Age);
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

object obj = _____;
dynamic dyn = _____;
obj += 4; // так нельзя
dyn += 4; // а так можно
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

dynamic obj = 3;            // здесь obj - целочисленное int
obj = "Hello world";        // obj - строка
Console.WriteLine(obj);     // Hello world
obj = new Person("Tom", 37); // obj - объект Person
Console.WriteLine(obj);     // 3
record class Person(string Name, int Age);
Console.WriteLine(obj);      // Person { Name = Tom, Age = 37 }
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «DLR в C#. Ключевое слово dynamic»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «DLR в C#. Ключевое слово dynamic», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

dynamic obj = 3;            // здесь obj - целочисленное int
Console.WriteLine(obj);     // 3

obj = "Hello world";        // obj - строка
Console.WriteLine(obj);     // Hello world

obj = new Person("Tom", 37); // obj - объект Person
Console.WriteLine(obj);      // Person { Name = Tom, Age = 37 }

record class Person(string Name, int Age);
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «DLR в C#. Ключевое слово dynamic»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

object obj = 24;
dynamic dyn = 24;
obj += 4; // так нельзя
dyn += 4; // а так можно
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «DLR в C#. Ключевое слово dynamic»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «DLR в C#. Ключевое слово dynamic»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «DLR в C#. Ключевое слово dynamic». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.