Was Sie sehen, ist ein ausdrucksstarkes Mitglied, kein Lambda-Ausdruck.
Wenn der Compiler auf ein Eigenschaftselement mit Ausdruckskörper stößt , konvertiert er es im Wesentlichen in einen Getter wie den folgenden:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Sie können dies selbst überprüfen, indem Sie den Code in ein Tool namens TryRoslyn pumpen .)
Mitglieder mit Ausdruckskörper sind - wie die meisten C # 6-Funktionen - nur syntaktischer Zucker . Dies bedeutet, dass sie keine Funktionen bereitstellen, die sonst mit vorhandenen Funktionen nicht erreicht werden könnten. Stattdessen ermöglichen diese neuen Funktionen die Verwendung einer ausdrucksstärkeren und prägnanteren Syntax
Wie Sie sehen können, haben Mitglieder mit Ausdruckskörper eine Handvoll Verknüpfungen, die die Mitglieder von Eigenschaften kompakter machen:
- Es ist nicht erforderlich, a zu verwenden
return
Anweisung zu verwenden, da der Compiler daraus schließen kann, dass Sie das Ergebnis des Ausdrucks zurückgeben möchten
- Es ist nicht erforderlich, einen Anweisungsblock zu erstellen, da der Textkörper nur ein Ausdruck ist
- Das
get
Schlüsselwort muss nicht verwendet werden, da es durch die Verwendung der Ausdruckssyntax für Mitglieder impliziert wird.
Ich habe den letzten Punkt fett gemacht, weil er für Ihre eigentliche Frage relevant ist, die ich jetzt beantworten werde.
Der Unterschied zwischen...
// expression-bodied member property
public int MaxHealth => x ? y:z;
Und...
// field with field initializer
public int MaxHealth = x ? y:z;
Ist das gleiche wie der Unterschied zwischen ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
Und...
public int MaxHealth = x ? y:z;
Was - wenn Sie Eigenschaften verstehen - offensichtlich sein sollte.
Um es klar zu machen: Die erste Auflistung ist eine Eigenschaft mit einem Getter unter der Haube, die jedes Mal aufgerufen wird, wenn Sie darauf zugreifen. Die zweite Auflistung ist ein Feld mit einem Feldinitialisierer, dessen Ausdruck nur einmal ausgewertet wird, wenn der Typ instanziiert wird.
Dieser Unterschied in der Syntax ist eigentlich ziemlich subtil und kann zu einem "Gotcha" führen, das von Bill Wagner in einem Beitrag mit dem Titel "AC # 6 Gotcha: Initialisierung vs. Ausdruck körperlicher Mitglieder" beschrieben wird. .
Während die Expression-bodied Mitglieder Lambda sind expression- wie , sie sind nicht Ausdrücke Lambda. Der grundlegende Unterschied besteht darin, dass ein Lambda-Ausdruck entweder zu einer Delegateninstanz oder zu einem Ausdrucksbaum führt. Mitglieder mit Ausdruckskörper sind nur eine Anweisung an den Compiler, eine Eigenschaft hinter den Kulissen zu generieren. Die Ähnlichkeit (mehr oder weniger) beginnt und endet mit dem Pfeil ( =>
).
Ich werde auch hinzufügen, dass ausdrucksstarke Mitglieder nicht auf Eigenschaftsmitglieder beschränkt sind. Sie arbeiten an all diesen Mitgliedern:
- Eigenschaften
- Indexer
- Methoden
- Betreiber
Hinzugefügt in C # 7.0
Sie arbeiten jedoch nicht mit diesen Mitgliedern:
- Verschachtelte Typen
- Veranstaltungen
- Felder