C# LanguageExpresiones lambda


Observaciones

Cierres

Las expresiones Lambda capturarán implícitamente las variables utilizadas y crearán un cierre . Un cierre es una función junto con algún contexto de estado. El compilador generará un cierre cada vez que una expresión lambda "encierre" un valor de su contexto circundante.

Ej. Cuando se ejecuta lo siguiente

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

safeApplyFilterPredicate se refiere a un nuevo objeto creado que tiene una referencia privado al valor actual de filterer , y cuya Invoke método comporta como

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

Esto puede ser importante, ya que mientras se mantenga la referencia al valor ahora en safeApplyFilterPredicate , habrá una referencia al objeto al que se refiere actualmente el filterer . Esto tiene un efecto en la recolección de basura y puede causar un comportamiento inesperado si el objeto al que se refiere el filterer actualidad está mutado.

Por otro lado, los cierres se pueden usar para deliberar un efecto para encapsular un comportamiento que involucra referencias a otros objetos.

P.ej

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

Los cierres también se pueden utilizar para modelar máquinas de estado:

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

Expresiones lambda Ejemplos relacionados