2009-10-28 58 views
7

在查找這個問題的答案時:「Why is an out parameter not allowed within an anonymous method?」我對lambda表達式和匿名方法實際上如何工作有些遺憾。lambda表達式如何在內部工作?

JaredPar在評論中指出:「想象一下,例如out參數指向堆棧上的局部變量,lambda可以在將來的任意點執行,因此可以在堆棧幀不再有效時執行」。

我指出,如果不會有任何其他變量的情況...這基本上讓我想知道我真的知道什麼lambda表達式。

我在想的事情是這樣的:

public void Foo(ComplexObject val, out SomeDelegate outDelegate) 
{ 
    ComplexObject obj = new ComplexObject(val) 
    SomeDelegate = delegate(int other) { return (obj.value * other); } 
} 

public void Bar() 
{ 
    SomeDelegate MyDel = null; 
    Foo(5, out MyDel); 
    int finalRes = MyDel(100); 
    // Whatever 
} 

在這種情況下,我真的不知道發生了什麼。 obj是棧上的一個引用,它在方法返回時不再有效,所以annonymous方法應該能夠(如果有效的話)真正知道這是一個引用類型,並且複製引用而不是值,如果是的話...如果「用例」差不多一樣,爲什麼不參考params?

回答

6

喬恩斯基特寫了in-depth description至第6部分的鏈接。

基本上,編譯器將外部方法轉換爲類,並將匿名方法訪問的所有變量轉換爲類中的字段。匿名方法在類上成爲常規實例方法。