Те, на що ти дивишся, - це тілесний вираз, а не лямбда-вираз.
Коли компілятор стикається з елементом властивості , вираженим вираженням , він по суті перетворює його в getter, як це:
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: Ініціалізація проти членів висловлювань" .
У той час як вираз працездатних члени лямбда expression- як , вони НЕ лямбда - вираження. Принципова відмінність полягає в тому, що лямбда-вираз призводить до або делегатного екземпляра, або до дерева виразів. Члени з вираженими виразами - це лише директива для компілятора генерувати властивість за кадром. Подібність (більш-менш) починається і закінчується стрілкою ( =>
).
Я також додам, що члени-виразники не обмежуються членами власності. Вони працюють над усіма цими членами:
- Властивості
- Індексатори
- Методи
- Оператори
Додано в C # 7.0
Однак вони не працюють над цими членами: