2014-12-27 22 views
3

C#編譯器和虛擬機(.NET公共語言運行時間)如何處理lambda函數C#?它們通常被翻譯成正常函數,但在編譯器的意義上被標記爲「匿名」,然後被視爲正常函數或者是否有其他方法?在C#編譯器和虛擬機中如何處理lambda表達式?

+0

這個問題很有趣,但在我看來對於StackOverflow來說太廣泛了。 – mybirthname 2014-12-27 17:55:16

+0

據我所知,幾分鐘後有人會給出一個答案顯示IL輸出;-) – t3chb0t 2014-12-27 18:03:55

+0

這是拼寫錯誤lambda的東西... – 2014-12-27 18:08:06

回答

2

它可能太寬泛。可以很容易地提供這就是說,一些基本信息:

  • 首先,「匿名」只是意味着,沒有姓名,通過它可以參考方法在代碼。任何匿名方法,無論是使用舊的delegate語法還是更新的lambda語法聲明,仍然會被編譯爲一個具有實際名稱的方法,並放入某個類中(您自己或編譯器爲此目的創建的一個新類);請參閱下面)。您根本無法訪問自己代碼中的名稱。除此之外,它基本上就像任何其他方法一樣。

  • 上面的主要例外是它將如何處理變量捕獲。如果匿名方法捕獲一個局部變量,那麼爲了這個目的聲明一個新的類(也隱藏在你的代碼中),這個變量被存儲在類中,而不是作爲一個實際的局部變量存儲,而匿名方法當然是風也在那個班上。

  • 最後要注意的是,lambda語法不僅用於匿名方法,還用於聲明Expression類的實例。在這種情況下,一些處理是相似的,但是當然你不會像匿名方法那樣獲得編譯到代碼中的類型。

正如其他人所建議的,如果你需要更多的細節,然後StackOverflow上可能是不適合的答案最好的地方(或者,如果是答案最好的地方,想必它已經被問和回答,你只需要搜索答案)。您可以使用ildasm.exe,dotPeek等來檢查實際生成的代碼,您可以閱讀C#規範,也可以在網上搜索其他詳細信息。

+0

謝謝你的回答,許多有價值的信息在這裏。我已經做了一個小小的研究,並且在'StackOverflow'中沒有找到類似的問題。雖然這個問題有點寬泛,但我認爲這值得提問。 – 2014-12-27 20:19:01