To, na co patrzysz, to wyrazisty członek, a nie wyrażenie lambda.
Gdy kompilator napotka element właściwości wyrażony w wyrażeniu , zasadniczo konwertuje go do elementu pobierającego w następujący sposób:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Możesz to sprawdzić samodzielnie, pompując kod do narzędzia o nazwie TryRoslyn ).
Członkowie o ekspresji - podobnie jak większość funkcji C # 6 - są po prostu cukrem syntaktycznym . Oznacza to, że nie zapewniają one funkcjonalności, której inaczej nie można byłoby uzyskać za pomocą istniejących funkcji. Zamiast tego te nowe funkcje umożliwiają stosowanie bardziej wyrazistej i zwięzłej składni
Jak widać, członkowie o wyrazistej budowie mają garść skrótów, dzięki którym członkowie właściwości są bardziej zwięzli:
- Nie ma potrzeby używania
return
instrukcji, ponieważ kompilator może wywnioskować, że chcesz zwrócić wynik wyrażenia
- Nie ma potrzeby tworzenia bloku instrukcji, ponieważ ciało jest tylko jednym wyrażeniem
- Nie ma potrzeby używania
get
słowa kluczowego, ponieważ wynika to z użycia składni elementu wyrażenia.
Pogrubiłem ostatni punkt, ponieważ dotyczy on twojego rzeczywistego pytania, na które odpowiem teraz.
Różnica pomiędzy...
// expression-bodied member property
public int MaxHealth => x ? y:z;
I...
// field with field initializer
public int MaxHealth = x ? y:z;
Jest taka sama jak różnica między ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
I...
public int MaxHealth = x ? y:z;
Co - jeśli rozumiesz właściwości - powinno być oczywiste.
Jednak dla jasności: pierwszy wpis to właściwość z geterem pod maską, który będzie wywoływany za każdym razem, gdy do niego wejdziesz. Druga lista jest polem z inicjatorem pola, którego wyrażenie jest oceniane tylko raz, gdy tworzony jest typ.
Ta różnica w składni jest w rzeczywistości dość subtelna i może prowadzić do „gotcha”, którą opisuje Bill Wagner w poście zatytułowanym „AC # 6 gotcha: Initialization vs. Expression Bodied Members” .
Podczas gdy członkowie są treściwe wyrażenie lambda expression- jak są one nie wyrażenia lambda. Podstawowa różnica polega na tym, że wyrażenie lambda powoduje wystąpienie delegacji lub drzewa wyrażeń. Pełnoprawne wyrażenia są tylko kompilatorem kompilatora, który generuje właściwość za kulisami. Podobieństwo (mniej więcej) zaczyna się i kończy strzałką ( =>
).
Dodam też, że członkowie o wyrazistym wyrazie nie są ograniczeni do członków własności. Pracują na wszystkich tych członkach:
- Nieruchomości
- Indeksujący
- Metody
- Operatorzy
Dodano w C # 7.0
Nie działają one jednak na tych członków:
- Typy zagnieżdżone
- Wydarzenia
- Pola