Digamos que tengo el siguiente código:métodos anónimos, el alcance y la serialización
public class Foo
{
private int x;
private int y;
public Bar CreateBar()
{
return new Bar(x,() => y);
}
}
[Serializable]
public class Bar
{
private int a;
private Func<int> b;
public Bar(int a, Func<int> b)
{
this.a = a;
this.b = b;
}
}
¿Qué ocurre con el alcance de los objetos y valores en este escenario? Como x es un tipo de valor, se pasa a Bar por valor y, por lo tanto, no es necesario que su alcance suceda. Pero, ¿qué le sucede a y? El valor de y necesita mantenerse para volver cuando realmente se evalúa b. ¿Se mantiene todo Foo para evaluar y en un momento posterior? Solo puedo suponer que Foo no tiene GC.
Ahora digamos que serializamos Bar en disco, luego lo deserializamos más tarde. ¿Qué se ha serializado realmente? ¿Se serializó Foo también? ¿Qué magia ha sucedido para que b se pueda evaluar después de que Bar se haya deserializado? ¿Puedes explicar lo que está sucediendo en IL?
En la sección 6.5.3 del Lenguaje de programación de C# (3ª edición), hay un ejemplo muy similar a este caso y se maneja tal como lo explicó Marc mediante un método de instancia generado por el compilador en Foo. –
¡Respuesta fantástica Marc! ¡Gracias! –