在我们去深入了解linq之前,有几个重要的基础需要先了解复习一下。
一、隐式类型var
var是C#3.0时新增的特性,现在这个var会大量的出现在我的代码中,首先,我先从实际的感受表达一下,这个关键字给我带来的实实在在的好处:
- 对于我这个懒惰的人来讲,这个关键字解救了我,假设你遇到这一行代码:ClassOuter.ClassInner1.ClassInner2.ClassInner3obj= CreateClassInner3(Param1,Param2,Param3,Param4);你在敲左边代码的时候是不是感觉有点痛苦,你必须要完整的打出变量的类型,可能这个变量的类型是很长很长,或者更尴尬的是,你可能记不清楚这个类型,相信你也会有这样的感觉,现在有了关键字,var obj=CreateClassInner3(param1,param2,param3,param4);就可以解决了,好爽,我又少敲了些代码,而且最重要的是,对于我这种赋值语句必须要在一行完成的强迫症的人来说,这太好了,即偷懒了,又美观,所以都交给编译器处理吧,话说微软貌似感觉想把程序员变的越来越依懒编译器了。
- 如果你觉得var只是微软想减轻程序员的工作,那就想的太简单了,现在看来,微软在提出var的时候是有野心,有目的,我想你已经猜出来了,对的,Linq(尽管当时Linq是在以C#3.5中提出的),在linq中var会发挥他强大的优势。
在这里,我不打算讲var的一些普通的特性,比如var的通用用法,比如减少程序员的工作量等,我打算重点讲的是针对于Linq部分var的强大,但是对于var 用法的一些注意点,还是要提一下,如下:
- var只能出现在方法内部的变量声明,而不能作为类中字段类型的声明
- 使用var时,右边的表达工或者变量必须有明确的类型,例如,你不能这样使用var o=null; 此时 null 的含义不明,他可以看作是任务引用类型,因此编译器无法判断o具体的类型;
- 使用var时不能只声明,后定义,例如: var o;
- 不要滥用var,并不是什么地方使用var都能带来好处的,站在开发过程中看来,貌似var 比大部分类型要精简很多,但是你想一下,你在写代码的时候,是很清楚你右边表达式的内容,但是另一个程序员在看你代码的时候,就会很痛苦了,因为他无法第一眼看出变量的实际类型,因此在实际的开过程中,除非很有必要(例如linq中,就不得不用var),开发准则中还是要求要写出完整的类型名。当然你自己写测试代码时就无所谓啦!
二、匿名类型
好了,我们到了var使用的重点了,匿名类型:
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。
我们先看下面一个例子:
var o = new { Name = "Jack", Address = "SH", Age = 26 };
此时,编译器会替我们生成一个匿名类型:
- 这个匿名类型是基于泛型的,一共有三个泛型参数TName(代表Name的类型),TAddress(代表Address的类型),Tage(代表Age的类型)。
- 这个匿名类型有三个属性,Name,Address,Age。
- 这个匿名类型中的泛型参数编译器推断出TName为string,TAddress为string,TAge为int。
- Name、Address、Age这几个属性是ReadOnly的。
- 这个匿名类型中没有无参构造方法。
- 这个匿名类型中重写了ToString、GetHashCode、Equal方法。