C#匿名类型及Lambda方法

来源:互联网 发布:中央部门预算软件 编辑:程序博客网 时间:2024/05/29 07:02

一、匿名类型产生的背景

  C#是一种强类型语言,即每个变量都必须在使用前声明其数据类型,无论是语言内置的类型还是自定义类型。而我们了解在许多其他语言中变量是可以“直接使用的”,即无需声明,由编译器决定变量标识符,例如Matlab,Javascript,Lisp等。不知道是不是因为Linq中对查询语句的革新,使得匿名类型开始凸显价值。匿名方法,即Lambda表达式,是提高编码效率的一大利器,它的出现让你不再费劲脑汁为那些临时性的函数起名字。

二、语法

  1、定义匿名变量

   var 变量名 = new {初始化语句};

  var 变量名 = new[] {初始化语句};

  匿名类型直接继承至System.Object,编译器会将其编译为只含属性的类型,并自动为其重写Object类型的ToString()方法。另外,若初始化语句中属性的名称、数量完全一致,则编译器会将多个这样的匿名变量编译为同一个类型。

    var myAnony1 = new {Id = 1, Name = "tang", Age = 28}; //考虑到元素都是属性,故命名时建议以大些字母开头    var myAnony2 = new {Id = 2, Name = "xiao", Age = 26}; //此处两个匿名变量会被编译为同一类型    var peoples = new[] {new {Name = "LiMing", Age = 30},                         new {Name = "LiuYangshu", Age = 23}}; //此处定义一个匿名数组

  2、定义Lambda表达式

  参数列表 => 函数体表达式

  其中参数列表可以是多个参数或为空,例如(i),(i,j),(),分别定义了1个、两个和空参数列表(当参数只有一个时,括号可以去掉);同时参数可以是显式定义和隐式定义的,上例中的参数都是隐式的。显式定义的例子如下:(int i),(int i, int j);

  函数体表达式中可以有多条语句。如果有多条语句需用{}将其包括其中(与if表达式类似)。

  通常Lambda表达式用在代表(delegate)中传递特定方法实例的地方。例如

List<int> evenNumbers = list.FindAll(i => (i % 2) == 0); //等于List<int> evenNumbers = list.FindAll(delegate(int i) { return (i % 2) == 0; } );