Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Что за инструкция с оператором => в коде?

// настройка полей с помощью Fluent API modelBuilder.Entity() .Property(c => c.FirstName).IsRequired().HasMaxLength(30);
modelBuilder.Entity() .Property(c => c.Email).HasMaxLength(100);
modelBuilder.Entity() .Property(c => c.Photo).HasColumnType("image");
Что это вот за инструкции в коде выше?
c => c.FirstName c => c.Email c => c.Photo


Ответ

Конструкции вида x => x.Email (а также более сложные, вида (x, y) => x.Email + y.Age или там n => { int s = 0; while (n-- > 0) s += n * n; return s; }) — это лямбда-выражения. Они используются в C# в двух смыслах.
Если в этом месте ожидается делегат/метод/что-то такое, то лямбда имеет смысл локально-определённой функции. Например, такой код:
Func f = (c => c.FirstName);
по существу не отличается от кода
Func f = GetFirstName;

static string GetFirstName(Entity c) { return c.FirstName; }
(но записывается быстрее). Кроме того (и это очень важно и удобно), лямбды могут ссылаться на локальные переменные и поля, видимые в точке определения. Например, так:
int x = hey.GimmeSomeX(); Func f = n => n * x;
Такого эффекта уже нельзя добиться с локальной функцией, поэтому компилятор «под капотом» использует более сложную конструкцию.

Если же в месте, где упоминается лямбда, ожидается специальная штука под названием дерево выражений, то лямбда конвертируется в это самое дерево выражений. Имея дерево выражений, можно посмотреть программным путём, что же там внутри. В частности, если у вас есть c.FirstName, вы можете увидеть, что это обращение к полю с именем FirstName. Именно для этого оно используется в вашем примере.
Чем же дерево выражений лучше, чем просто передать строку "FirstName"? Дело в том, что в строке вы можете ошибиться, а вот за правильностью лямбда-выражения следит компилятор. Также при переименовании IDE сможет правильно подхватить изменения. А со строкой возможны, понятно, проблемы.

Комментариев нет:

Отправить комментарий