Linq的那些事——從Linq擴展方法回顧C#語言基礎

林奇,某市A大學計算機系大三的學生,性格孤僻,除了玩電腦打籃球以外沒有其他愛好,習慣一個人呆在宿舍上網,學習成績一般。李秋,林奇的同學兼女友,性格開朗,喜歡接觸新事物,特別熱衷於新技術的學習和應用而且英語特別的優秀。

話說自微軟發佈了Linq以後,李秋就一直潛心於該技術的學習和應用每天除了上必修課以外就沒有出過宿舍,兩人也有近3個月沒有約會,平常的溝通主要通過網絡。一天林奇實在是憋不住了於是在qq上...

林:你最近還在研究Linq嗎?纔出來不久,中文版的資料都還沒翻譯過來幹嗎那麼急?
李:你不知道,Linq太偉大了。
林:有多偉大啊!難不成他會到飯堂給你打飯不成?
李:你聽俺說吧!Linq就是語言級集成查詢(Language INtegrated Query),通過它我們可以查詢多種形式的數據比如有SQL,Dataset和XML等等。
林:好像很牛哦!俺就不信它那麼就一點缺點都沒有!
李:當然啦!任何事物都會有弱點的Linq也不能例外,舉個例子說把!在國外就有人發現了Linq其中一個操作符號Sum會出現問題。
林:啥問題啊?
李:由於它的作用主要是進行算術和的運算而且返回int32類型的值,所以當計算大量數據的時候很容易出現緩衝溢出的問題。
林:你從那裏知道的?
李:一個Troy Magennis的外國人發現的,你到這裏看看[url]http://aspiring-technology.com/blogs/troym/archive/2006/10/06/24.aspx[/url]

十分鐘以後......

林:慘了!他重載的四個方法怎麼都有看不懂的呢?
李:所以平常才叫你把C#語法學好啊!現在都出3.5版本了!你說出來看看!
林貼了第一個代碼:
checked 
{
    
foreach (int v in source) sum += v;
}
林:這個checked啥意思啊!
李:它是用來進行溢出檢查的,如果發生溢出就拋出異常。
林貼了第二個代碼:
public static long? LongSum(this IEnumerable<int?> source)
林:好端端的幹嗎在long後加個?好又在IEnumerable前加個this關鍵字
李:其實這裏long?是可空類型,也就是說返回的值可以爲null。this在這裏是Linq的新特性,即擴展方法。

林貼了第三個代碼:
 public static long LongSum<T>(this IEnumerable<T> source, Func<T, int> selector)
林:這裏LongSum<T>啥意思?
李:泛型啊!你肯定上次逃課了,老師在課上說得很清楚。其實就是一個泛型方法,只是C#編譯器會在調用該方法的參數類型後辨別該方法的類型,所以不需要把泛型類賦予該方法。也就實現了泛型方法和普通方法一樣調用。
林:這個函數的參數爲什麼這麼寫?
李:從它的簽名來看,由於參數前帶有this關鍵字,應該是一個擴展函數。第一個參數標示該參數是所有實現了泛型集合類。Func<T,int>其實就是一個泛型委託,它定義的是封裝一個具有一個參數並返回int參數指定的類型值的方法。

這時候的林奇才恍然大悟,慢慢的他才明白了老師課堂上提到的一個非常抽象的概念泛型。泛型除了有類以外還有方法、集合和委託。他心裏面覺得不好意思,準確的應該是很沒面子,於是他下定決心要把Linq這項技術掌握好!別在女友面前丟人!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章