次のコードがあるとします。
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も連載したの?Bar がデシリアライズされた後に b を評価できるようにするには、どのような魔法が使われているのでしょうか? IL で何が起こっているのか説明できますか?