Linq的那些事——从Linq扩展方法回顾C#语言基础
林奇,某市A大学计算机系大三的学生,性格孤僻,除了玩电脑打篮球以外没有其他爱好,习惯一个人呆在宿舍上网,学习成绩一般。李秋,林奇的同学兼女友,性格开朗,喜欢接触新事物,特别热衷于新技术的学习和应用而且英语特别的优秀。
话说自微软发布了Linq以后,李秋就一直潜心于该技术的学习和应用每天除了上必修课以外就没有出过宿舍,两人也有近3个月没有约会,平常的沟通主要通过网络。一天林奇实在是憋不住了于是在qq上...
林:你最近还在研究Linq吗?才出来不久,中文版的资料都还没翻译过来干吗那么急?
李:你不知道,Linq太伟大了。
林:有多伟大啊!难不成他会到饭堂给你打饭不成?
李:你听俺说吧!Linq就是语言级集成查询(Language INtegrated Query),通过它我们可以查询多种形式的数据比如有SQL,Dataset和XML等等。
林:好像很牛哦!俺就不信它那么就一点缺点都没有!
李:当然啦!任何事物都会有弱点的Linq也不能例外,举个例子说把!在国外就有人发现了Linq其中一个操作符号Sum会出现问题。
林:啥问题啊?
李:由于它的作用主要是进行算术和的运算而且返回int32类型的值,所以当计算大量数据的时候很容易出现缓冲溢出的问题。
林:你从那里知道的?
李:一个Troy Magennis的外国人发现的,你到这里看看http://aspiring-technology.com/blogs/troym/archive/2006/10/06/24.aspx
十分钟以后......
林:惨了!他重载的四个方法怎么都有看不懂的呢?
李:所以平常才叫你把C#语法学好啊!现在都出3.5版本了!你说出来看看!
林贴了第一个代码:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
林:这个checked啥意思啊!
李:它是用来进行溢出检查的,如果发生溢出就抛出异常。
林贴了第二个代码:
![](/Images/OutliningIndicators/None.gif)
林:好端端的干吗在long后加个?好又在IEnumerable前加个this关键字
李:其实这里long?是可空类型,也就是说返回的值可以为null。this在这里是Linq的新特性,即扩展方法。
林贴了第三个代码:
![](/Images/OutliningIndicators/None.gif)
李:泛型啊!你肯定上次逃课了,老师在课上说得很清楚。其实就是一个泛型方法,只是C#编译器会在调用该方法的参数类型后辨别该方法的类型,所以不需要把泛型类赋予该方法。也就实现了泛型方法和普通方法一样调用。
林:这个函数的参数为什么这么写?
李:从它的签名来看,由于参数前带有this关键字,应该是一个扩展函数。第一个参数标示该参数是所有实现了泛型集合类。Func<T,int>其实就是一个泛型委托,它定义的是封装一个具有一个参数并返回int参数指定的类型值的方法。
这时候的林奇才恍然大悟,慢慢的他才明白了老师课堂上提到的一个非常抽象的概念泛型。泛型除了有类以外还有方法、集合和委托。他心里面觉得不好意思,准确的应该是很没面子,于是他下定决心要把Linq这项技术掌握好!别在女友面前丢人!