То, на что вы смотрите, это член с выражением тела, а не лямбда-выражение.
Когда компилятор встречает элемент свойства с выражением-выражением , он по сути преобразует его в метод получения, подобный этому:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Вы можете убедиться в этом сами, накачав код в инструмент под названием TryRoslyn .)
Члены с выраженным выражением - как и большинство функций C # 6 - просто синтаксический сахар . Это означает, что они не предоставляют функциональность, которая не могла бы быть достигнута с помощью существующих функций. Вместо этого эти новые функции позволяют использовать более выразительный и лаконичный синтаксис
Как вы можете видеть, члены с выражением выражения имеют несколько горячих клавиш, которые делают элементы свойств более компактными:
- Нет необходимости использовать
return
оператор, потому что компилятор может сделать вывод, что вы хотите вернуть результат выражения
- Нет необходимости создавать блок операторов, потому что тело - это только одно выражение
- Нет необходимости использовать
get
ключевое слово, поскольку оно подразумевается использованием синтаксиса члена-выражения-тела.
Я выделил последний пункт жирным шрифтом, потому что он имеет отношение к вашему актуальному вопросу, на который я сейчас отвечу.
Разница между...
// expression-bodied member property
public int MaxHealth => x ? y:z;
И...
// field with field initializer
public int MaxHealth = x ? y:z;
Это так же, как разница между ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
И...
public int MaxHealth = x ? y:z;
Который - если вы понимаете свойства - должен быть очевидным.
Просто для ясности: первый список - это свойство с геттером под капотом, которое будет вызываться при каждом обращении к нему. Второй листинг - это поле с инициализатором поля, выражение которого вычисляется только один раз, когда создается экземпляр типа.
Это различие в синтаксисе на самом деле довольно тонкое и может привести к «погрешности», описанной Биллом Вагнером в посте «AC # 6 gotcha: Инициализация против членов тела с выражением» .
Хотя члены с выражением тела похожи на лямбда-выражения , они не являются лямбда-выражениями. Принципиальное отличие состоит в том, что лямбда-выражение приводит либо к экземпляру делегата, либо к дереву выражений. Элементы с выражением в выражении - это просто директива для компилятора для создания свойства за сценой. Сходство (более или менее) начинается и заканчивается стрелкой ( =>
).
Я также добавлю, что члены с выраженным выражением не ограничены членами собственности. Они работают на всех этих членов:
- свойства
- индексаторы
- методы
- операторы
Добавлено в C # 7.0
Тем не менее, они не работают над этими членами:
- Вложенные типы
- События
- поля