O que você está vendo é um membro com expressão, não uma expressão lambda.
Quando o compilador encontra um membro da propriedade do corpo da expressão , ele basicamente o converte em um getter como este:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Você pode verificar isso por si mesmo bombeando o código para uma ferramenta chamada TryRoslyn .)
Membros com corpo de expressão - como a maioria dos recursos do C # 6 - são apenas açúcar sintático . Isso significa que eles não fornecem funcionalidades que não poderiam ser alcançadas por meio de recursos existentes. Em vez disso, esses novos recursos permitem que uma sintaxe mais expressiva e sucinta seja usada
Como você pode ver, os membros com expressão têm vários atalhos que tornam os membros da propriedade mais compactos:
- Não há necessidade de usar uma
return
instrução porque o compilador pode inferir que você deseja retornar o resultado da expressão
- Não há necessidade de criar um bloco de instruções porque o corpo é apenas uma expressão
- Não há necessidade de usar a
get
palavra-chave, porque está implícita no uso da sintaxe do membro com corpo de expressão.
Tornei o ponto final em negrito, porque é relevante para a sua pergunta real, que responderei agora.
A diferença entre...
// expression-bodied member property
public int MaxHealth => x ? y:z;
E...
// field with field initializer
public int MaxHealth = x ? y:z;
É o mesmo que a diferença entre ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
E...
public int MaxHealth = x ? y:z;
O que - se você entende as propriedades - deve ser óbvio.
Apenas para ficar claro: a primeira listagem é uma propriedade com um getter sob o capô que será chamada sempre que você acessá-la. A segunda listagem é um campo com um inicializador de campos, cuja expressão é avaliada apenas uma vez, quando o tipo é instanciado.
Essa diferença de sintaxe é realmente bastante sutil e pode levar a uma "pegadinha", descrita por Bill Wagner em um post intitulado "Pegada da AC # 6: inicialização versus membros corporados de expressão" .
Enquanto membros com expressão corporal são semelhantes a expressões lambda , eles não são expressões lambda. A diferença fundamental é que uma expressão lambda resulta em uma instância delegada ou em uma árvore de expressão. Membros com corpo de expressão são apenas uma diretiva para o compilador para gerar uma propriedade nos bastidores. A semelhança (mais ou menos) começa e termina com a seta ( =>
).
Também acrescentarei que membros com expressão corporal não se limitam a membros de propriedade. Eles trabalham em todos esses membros:
- Propriedades
- Indexadores
- Métodos
- Operadores
Adicionado no C # 7.0
No entanto, eles não funcionam com esses membros:
- Tipos aninhados
- Eventos
- Campos