比方說,我有以下代碼:匿名方法,範圍和序列化
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發生了什麼?當b被實際評估時,y的值需要堅持返回。是否所有的Foo都會在以後評估y?我只能假設Foo不是GC'ed。
現在讓我們假設我們將Bar序列化到磁盤,然後將其反序列化。實際上已經序列化了什麼?它是否也連接Foo?在Bar被反序列化之後,有什麼魔力讓b可以被評估?你能解釋IL中發生了什麼嗎?
在C#編程語言(第三版)的第6.5.3節中,有一個與這種情況非常相似的例子,它的處理就像Marc在Foo上編譯器生成的實例方法所解釋的那樣。 – 2009-08-15 14:45:41
夢幻般的答案馬克!謝謝! – 2009-08-18 16:16:39