19.6.6 查询语法和方法语法的统一

查看代码清单19-20编译生成的CIL代码,可以发现LINQ语法实际上和方法语法是统一的,编译为CIL代码后两者都是基于扩展方法Where和Lambda表达式的。代码清单19-20编译后,关键部分CIL代码如代码清单19-21所示。

代码清单19-21 部分CIL代码


IL_0033:

call class

[mscorlib]System.Collections.Generic.IEnumerable1<!!0>

[System.Core]System.Linq.Enumerable:Where<int32>(

class[mscorlib]System.Collections.Generic.IEnumerable1

<!!0>,class[mscorlib]System.Func`2<!!0,bool>)


可见LINQ查询语法在本质上等同于定义在System.Linq.Enumerable静态类的Where扩展方法。使用LINQ可以比直接使用Where结合Lambda表达式更直观,只不过编译器在这里充当了“翻译官”的角色。最后,给出Where扩展方法的签名,如下:


public static IEnumerable<TSource>Where<TSource>(this

IEnumerable<TSource>source,Func<TSource,int,bool>predicate);