Looking for c# Keywords? Try Ask4Keywords

C# LanguageLambda-Ausdrücke


Bemerkungen

Verschlüsse

Lambda-Ausdrücke erfassen implizit die verwendeten Variablen und erzeugen eine Schließung . Ein Abschluss ist eine Funktion zusammen mit einem Zustandskontext. Der Compiler generiert einen Abschluss, wenn ein Lambda-Ausdruck einen Wert aus dem umgebenden Kontext "umschließt".

ZB wenn das Folgende ausgeführt wird

Func<object, bool> safeApplyFiltererPredicate = o => (o != null) && filterer.Predicate(i);

safeApplyFilterPredicate bezieht sich auf ein neu erstelltes Objekt, das einen privaten Verweis auf den aktuellen Wert des filterer hat und dessen Invoke Methode sich so verhält

o => (o != null) && filterer.Predicate(i);

Dies kann wichtig sein, denn solange der Verweis auf den Wert in safeApplyFilterPredicate beibehalten wird, gibt es einen Verweis auf das Objekt, auf das sich der filterer aktuell bezieht. Dies hat Auswirkungen auf die Garbage Collection und kann zu einem unerwarteten Verhalten führen, wenn das Objekt, auf das der filterer aktuell verweist, mutiert ist.

Auf der anderen Seite können Verschlüsse verwendet werden, um absichtlich einen Effekt abzukapseln, um ein Verhalten zu kapseln, das Verweise auf andere Objekte beinhaltet.

Z.B

var logger = new Logger();
Func<int, int> Add1AndLog = i => {
    logger.Log("adding 1 to " + i);
    return (i + 1);
};

Verschlüsse können auch zum Modellieren von Zustandsmaschinen verwendet werden:

Func<int, int> MyAddingMachine() {
    var i = 0;
    return x => i += x;
};

Lambda-Ausdrücke Verwandte Beispiele