揭開 C#.NET 官方原始碼 System.Func、System.Action、System.Delegate 及 delegate 關鍵字背後的技術面紗
當 我們談到 delegate 和 lambda、Func、Action 這幾個字眼時,腦中觀念上總是有些模糊不清,就像是遠方有一片烏雲,雖然遙遠,卻擔心有一天會飄過來。我認為基本觀念很重要,像是delegate/Delegate大小寫代表不同意思,全小寫的delegate是C#關鍵字,Delegate/MulticastDelegate是函式庫類別,Func和Action是BCL預先定義方法簽章的17組委派類型,這34組方法簽章都是泛型函式。另外,官方有些文件存在著一些描述上令人困惑的文字,甚至我聽到有「Func和Action就是繼承自Delegate類別的衍生類別」的奇怪說法在流傳著,基於存在著這些奇點現象,若我們真的想要知道上述觀念是否正確時,最好的方法是直接看原始碼才能見分曉。 本文試著透過官方.NET基礎類別函式庫(BCL)的原始程式碼(Source Code)一窺堂奧,解釋編譯器怎麼編譯一個delegate語法或者怎麼實作,並提出個人見解以饗諸公。 探索System.Func、System.Action、System.Delegate原始碼 二話不說先給兩個官方Source Code網址: System.Func/System.Action: https://referencesource.microsoft.com/#mscorlib/system/action.cs System.Delegate: https://referencesource.microsoft.com/#mscorlib/system/delegate.cs,0dd8585ba1833ad7 坦白說我看不到10秒就看出「 貓膩 」了, 本文寫下心得,也可以說是依據個人有限知識+腦補的結果,但目的是期望能拋磚引玉,看到更多討論C#語法的觀念文,去幫助新手建立正確的程式根基。 先離題一下,談談這篇文章的濫觴, 隨著科技進步,現在的程式設計師跟以前寫程式的人的相比,有著很大的不同。 早期的程式設計師撰寫低階或中階語言,仰賴自身對計算機各種運算單元和IO知識,也要對資料結構的演算方法有足夠的學習,程式實體只有程式人員寫的語法和電腦機器碼兩種。 現代的程式設計師進行程式寫作是否能有高品質的程式碼產出,端依賴對該語言的關鍵...