tengo el siguiente código:Prevenir .NET de "lifting" variables locales
string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));
Debido a que el compilador reemplaza la variable prefijo con un cierre "NUEVO: brownie" se imprime en la consola.
¿Hay alguna manera fácil de evitar que el compilador eleve la variable de prefijo mientras sigue usando una expresión lambda? Me gustaría una manera de hacer mi trabajo Func idéntica a:
Func<string, string> prependAction = (x => "OLD:" + x);
La razón que necesito esto es me gustaría serializar el delegado resultante. Si la variable de prefijo está en una clase no serializable, la función anterior no se serializará.
La única forma de evitar esto puedo ver en este momento es la creación de una nueva clase serializable que almacena la cadena como una variable miembro y tiene el método de cadena Prefijo:
string prefix = "NEW:";
var prepender = new Prepender {Prefix = prefix};
Func<string, string> prependAction = prepender.Prepend;
prefix = "OLD:";
Console.WriteLine(prependAction("brownie"));
Con clase de ayuda:
[Serializable]
public class Prepender
{
public string Prefix { get; set; }
public string Prepend(string str)
{
return Prefix + str;
}
}
Esto parece mucho trabajo adicional para hacer que el compilador sea "tonto".
¿Entonces su pregunta no es sobre la evaluación perezosa, sino sobre la serialización? – Sam