C# LanguageLambda Expressions


Osservazioni

chiusure

Le espressioni lambda catturano implicitamente le variabili utilizzate e creano una chiusura . Una chiusura è una funzione insieme a un contesto statale. Il compilatore genererà una chiusura ogni volta che un'espressione lambda "racchiude" un valore dal suo contesto circostante.

Ad esempio quando viene eseguito quanto segue

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

safeApplyFilterPredicate fa riferimento a un oggetto appena creato che ha un riferimento privato al valore corrente del filterer e il cui metodo Invoke si comporta come

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

Questo può essere importante, poiché finché viene mantenuto il riferimento al valore ora in safeApplyFilterPredicate , ci sarà un riferimento all'oggetto cui si riferisce attualmente il filterer . Ciò ha un effetto sulla garbage collection e può causare comportamenti imprevisti se l'oggetto al quale il filterer riferisce attualmente è mutato.

D'altra parte, le chiusure possono essere utilizzate per deliberare l'effetto di incapsulare un comportamento che implica riferimenti ad altri oggetti.

Per esempio

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

Le chiusure possono anche essere utilizzate per modellare macchine a stati:

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

Lambda Expressions Esempi correlati