Для чего нужен Expression в C#?

«Для чего нужен Expression в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Expression в C# представляет древовидную структуру кода (синтаксическое дерево), которую можно анализировать, преобразовывать и компилировать во время выполнения. Это основа для метапрограммирования и динамической генерации кода.

Основные сценарии использования:

  1. ORM и запросы к БД (например, Entity Framework): LINQ-запросы преобразуются в SQL через анализ дерева выражений.
  2. Динамическая компиляция с высокой производительностью: Компиляция выражения в делегат (Compile()) для быстрого доступа к свойствам или вызова методов, что значительно быстрее рефлексии.
  3. Построение динамических фильтров и правил: Создание сложных предикатов (Where) на лету.

Пример:

// Создаем выражение как данные, а не исполняемый код
Expression<Func<int, int, int>> addExpression = (a, b) => a + b;

// Анализируем его структуру
BinaryExpression body = (BinaryExpression)addExpression.Body;
Console.WriteLine(body.NodeType); // Выведет: Add

// Компилируем в быстрый делегат для выполнения
Func<int, int, int> compiledDelegate = addExpression.Compile();
int result = compiledDelegate(5, 3); // result = 8

Ключевое отличие от обычной лямбды (Func<int, int, int>): Лямбда-выражение, присвоенное Expression, не выполняется сразу — оно сохраняется как структура данных для последующего анализа.