Скажем, у меня есть следующий код:Анонимные методы, область и сериализации
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;
}
}
Что происходит с областью объектов и ценностей в этом случае? Поскольку x является типом значения, он передается в Bar по значению, и поэтому в его область ничего не должно произойти. Но что происходит с y? Значение y должно придерживаться, чтобы возвращаться, когда b фактически оценивается. Все ли Foo хранится вокруг, чтобы оценить y в более позднее время? Я могу только предположить, что Foo не GC.
Теперь предположим, что мы сериализуем Bar на диск, а затем десериализуем его позже. Что на самом деле было сериализовано? Это тоже сериал Foo? Какая магия продолжалась, чтобы b можно было оценить после десериализации Бар? Можете ли вы объяснить, что происходит в IL?
В разделе 6.5.3 языка программирования C# (3-е издание) приведен пример, очень похожий на этот случай, и он обрабатывается так же, как Марк объясняется методом экземпляра экземпляра компилятора на Foo. –
Фантастический ответ Марк! Благодаря! –