Lo que estás viendo es un miembro con cuerpo de expresión, no una expresión lambda.
Cuando el compilador encuentra un miembro de propiedad con cuerpo de expresión , esencialmente lo convierte en un captador como este:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Puede verificar esto usted mismo bombeando el código a una herramienta llamada TryRoslyn ).
Los miembros con cuerpo de expresión, como la mayoría de las características de C # 6, son solo azúcar sintáctica . Esto significa que no proporcionan una funcionalidad que de otro modo no se podría lograr a través de las funciones existentes. En cambio, estas nuevas características permiten utilizar una sintaxis más expresiva y sucinta
Como puede ver, los miembros con cuerpo de expresión tienen un puñado de atajos que hacen que los miembros de propiedad sean más compactos:
- No es necesario usar una
return
declaración porque el compilador puede inferir que desea devolver el resultado de la expresión
- No es necesario crear un bloque de instrucción porque el cuerpo es solo una expresión
- No es necesario usar la
get
palabra clave porque está implícita en el uso de la sintaxis de miembro con cuerpo de expresión.
He puesto el último punto en negrita porque es relevante para su pregunta real, que responderé ahora.
La diferencia entre...
// expression-bodied member property
public int MaxHealth => x ? y:z;
Y...
// field with field initializer
public int MaxHealth = x ? y:z;
Es lo mismo que la diferencia entre ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
Y...
public int MaxHealth = x ? y:z;
Lo cual, si comprende las propiedades, debería ser obvio.
Sin embargo, para ser claros: la primera lista es una propiedad con un captador debajo del capó que se llamará cada vez que acceda a ella. La segunda lista es un campo con un inicializador de campo, cuya expresión solo se evalúa una vez, cuando se instancia el tipo.
Esta diferencia en la sintaxis es en realidad bastante sutil y puede conducir a un "problema" que describe Bill Wagner en una publicación titulada "AC # 6 gotcha: Initialization vs. Expression Bodied Members" .
Mientras que los miembros de expresión lambda cuerpo son expresión- como , que son no las expresiones lambda. La diferencia fundamental es que una expresión lambda da como resultado una instancia delegada o un árbol de expresión. Los miembros con cuerpo de expresión son solo una directiva para que el compilador genere una propiedad detrás de escena. La similitud (más o menos) comienza y termina con la flecha ( =>
).
También agregaré que los miembros con cuerpo de expresión no se limitan a los miembros de la propiedad. Trabajan en todos estos miembros:
- Propiedades
- Indexadores
- Métodos
- Operadores
Agregado en C # 7.0
Sin embargo, no trabajan en estos miembros:
- Tipos anidados
- Eventos
- Campos