假设我有以下代码:
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,因此,它的作用域不需要发生任何事情。但是你怎么了?实际评估 b 时,需要保留 y 的值才能返回。是否所有的 Foo 都保留在以后评估 y ?我只能假设 Foo 没有被 GC 处理。
现在假设我们将 Bar 序列化到磁盘,然后再反序列化它。什么实际上已经被序列化了?它是否也对 Foo 进行了序列化?在 Bar 被反序列化之后,发生了什么魔法使得 b 可以被评估?你能解释一下 IL 中发生了什么吗?