Quello che stai guardando è un membro dal corpo di espressione non un'espressione lambda.
Quando il compilatore incontra un membro della proprietà con corpo di espressione , lo converte essenzialmente in un getter come questo:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Puoi verificarlo tu stesso pompando il codice in uno strumento chiamato TryRoslyn .)
I membri con espressione corporea - come la maggior parte delle funzionalità di C # 6 - sono solo zucchero sintattico . Ciò significa che non forniscono funzionalità che altrimenti non potrebbero essere ottenute tramite le funzionalità esistenti. Al contrario, queste nuove funzionalità consentono di utilizzare una sintassi più espressiva e concisa
Come puoi vedere, i membri con corpo di espressione hanno una manciata di scorciatoie che rendono i membri di proprietà più compatti:
- Non è necessario utilizzare
return
un'istruzione poiché il compilatore può dedurre che si desidera restituire il risultato dell'espressione
- Non è necessario creare un blocco di istruzioni poiché il corpo è solo un'espressione
- Non è necessario utilizzare la
get
parola chiave perché è implicita nell'uso della sintassi del membro con espressione.
Ho sottolineato il punto finale perché è pertinente alla tua vera domanda, a cui risponderò ora.
La differenza tra...
// expression-bodied member property
public int MaxHealth => x ? y:z;
E...
// field with field initializer
public int MaxHealth = x ? y:z;
È uguale alla differenza tra ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
E...
public int MaxHealth = x ? y:z;
Che - se capisci le proprietà - dovrebbe essere ovvio.
Per essere chiari, però: il primo elenco è una proprietà con un getter sotto il cofano che verrà chiamata ogni volta che accederai. Il secondo elenco è un campo con un inizializzatore di campo, la cui espressione viene valutata una sola volta, quando il tipo viene istanziato.
Questa differenza di sintassi è in realtà abbastanza sottile e può portare a un "gotcha" che è descritto da Bill Wagner in un post intitolato "AC # 6 gotcha: Initialization vs. Expression Bodied Members" .
Mentre i membri espressione di corpo sono lambda da un'espressione come , essi sono non espressioni lambda. La differenza fondamentale è che un'espressione lambda risulta in un'istanza delegata o in un albero di espressioni. I membri con corpo di espressione sono solo una direttiva per il compilatore per generare una proprietà dietro le quinte. La somiglianza (più o meno) inizia e termina con la freccia ( =>
).
Aggiungerò anche che i membri con corpo di espressione non si limitano ai membri di proprietà. Lavorano su tutti questi membri:
- Proprietà
- indicizzatori
- metodi
- operatori
Aggiunto in C # 7.0
Tuttavia, non funzionano su questi membri:
- Tipi nidificati
- eventi
- campi