C#
編譯器和虛擬機(.NET公共語言運行時間)如何處理lambda
函數C#
?它們通常被翻譯成正常函數,但在編譯器的意義上被標記爲「匿名」,然後被視爲正常函數或者是否有其他方法?在C#編譯器和虛擬機中如何處理lambda表達式?
回答
它可能太寬泛。可以很容易地提供這就是說,一些基本信息:
首先,「匿名」只是意味着,沒有姓名,通過它可以參考方法在代碼。任何匿名方法,無論是使用舊的
delegate
語法還是更新的lambda語法聲明,仍然會被編譯爲一個具有實際名稱的方法,並放入某個類中(您自己或編譯器爲此目的創建的一個新類);請參閱下面)。您根本無法訪問自己代碼中的名稱。除此之外,它基本上就像任何其他方法一樣。上面的主要例外是它將如何處理變量捕獲。如果匿名方法捕獲一個局部變量,那麼爲了這個目的聲明一個新的類(也隱藏在你的代碼中),這個變量被存儲在類中,而不是作爲一個實際的局部變量存儲,而匿名方法當然是風也在那個班上。
最後要注意的是,lambda語法不僅用於匿名方法,還用於聲明
Expression
類的實例。在這種情況下,一些處理是相似的,但是當然你不會像匿名方法那樣獲得編譯到代碼中的類型。
正如其他人所建議的,如果你需要更多的細節,然後StackOverflow上可能是不適合的答案最好的地方(或者,如果是答案最好的地方,想必它已經被問和回答,你只需要搜索答案)。您可以使用ildasm.exe,dotPeek等來檢查實際生成的代碼,您可以閱讀C#規範,也可以在網上搜索其他詳細信息。
謝謝你的回答,許多有價值的信息在這裏。我已經做了一個小小的研究,並且在'StackOverflow'中沒有找到類似的問題。雖然這個問題有點寬泛,但我認爲這值得提問。 – 2014-12-27 20:19:01
- 1. 如何處理lambda表達式在拉姆達預編譯
- 2. 錫蘭編譯器和虛擬機
- 3. 在C++中翻譯lambda表達式c#
- 4. Lambda表達式:編譯器行爲
- 5. 口譯VS編譯器VS虛擬機
- 6. lambda表達式和異常處理
- 7. 如何爲Erlang虛擬機編譯
- 8. 模擬在C++ lambda表達式
- 9. C++編譯器如何在內存中實現虛擬繼承?
- 10. 如何在JDK8中動態編譯/加載lambda表達式?
- 11. lambda中的異常處理表達式
- 12. 虛擬函數編譯器優化C++
- 13. C#Lambda表達式和NHibernate
- 14. C#lambda表達式和IComparer
- 15. 編譯器如何處理`(c = getchar())!= EOF`?
- 16. 緩存編譯的lambda表達式
- 17. Lambda表達式不會編譯
- 18. 的java lambda表達式沒有編譯
- 19. 添加lambda表達式試圖編譯
- 20. WAMP和XAMPP處理虛擬主機的方式有何不同?
- 21. 如何編寫LINQ在lambda表達式
- 22. 如何處理任務中的lambda表達式中的異常?
- 23. CLI/C++虛擬事件處理器
- 24. 如何編寫虛擬機
- 25. Java8中的Lambda表達式的內部編譯器錯誤
- 26. 在Azure虛擬機上處理視頻
- 27. 如何處理lambda表達式中的異常
- 28. C#Lambda表達式
- 29. lambda表達式c#
- 30. C++ lambda表達式
這個問題很有趣,但在我看來對於StackOverflow來說太廣泛了。 – mybirthname 2014-12-27 17:55:16
據我所知,幾分鐘後有人會給出一個答案顯示IL輸出;-) – t3chb0t 2014-12-27 18:03:55
這是拼寫錯誤lambda的東西... – 2014-12-27 18:08:06