1、 13.1 隐式类型的局部变量和数组隐式类型的局部变量和数组 13.2 对象和集合初始值设定项对象和集合初始值设定项 13.3 匿名类型匿名类型 13.4 扩展方法扩展方法 13.5 Lambda表达式表达式 13.6 小结小结13.1 隐式类型的局部变量和数组13.1.1 隐式类型的局部变量隐式类型的局部变量在在C#3.0中,可以使用中,可以使用var关键字声明变量,变量关键字声明变量,变量的类型由编译器智能推断。编译器推断的依据即的类型由编译器智能推断。编译器推断的依据即初始化语句右边的表达式,例如下列代码。初始化语句右边的表达式,例如下列代码。var a=100;编译器会根据后面的表达式
2、推断出编译器会根据后面的表达式推断出a的类型为的类型为int,即编译器在内部会实现如下相同的定义。即编译器在内部会实现如下相同的定义。int a=100;推断的类型可以是内置类型、匿名类型或用户自推断的类型可以是内置类型、匿名类型或用户自定义类型。定义类型。下列代码演示隐式类型的应用。下列代码演示隐式类型的应用。var myBool=false;/编译器推断为布尔型(编译器推断为布尔型(bool)var x=123.456;/编译器推断为小数型(编译器推断为小数型(decimal)var y=2.7E+23;/编译器推断为双精度(编译器推断为双精度(double)var name=“Jane”
3、;/编译器推断为字符串(编译器推断为字符串(string)13.1.1 隐式类型的局部变量注意:注意:在使用在使用var声明隐式变量时,必须同时初始化声明隐式变量时,必须同时初始化变量,并且不能将变量初始为变量,并且不能将变量初始为Null、方法组或、方法组或匿名函数。匿名函数。当声明的变量被推断出以后,变量的类型就不当声明的变量被推断出以后,变量的类型就不能改变了,例如下列代码。能改变了,例如下列代码。var a=100;a=100.10;此时就会出现编译错误:无法将类型此时就会出现编译错误:无法将类型“double”隐式转换为隐式转换为“int”。13.1.1 隐式类型的局部变量不能将不能
4、将var用于类范围领域,即不能用作类的字段。用于类范围领域,即不能用作类的字段。本节题目本节题目“隐式类型的局部变量隐式类型的局部变量”也提示了隐式也提示了隐式类型只能用作局部变量。类型只能用作局部变量。由由var声明的变量不能用在初始化表达式中,会造声明的变量不能用在初始化表达式中,会造成编译错误,例如下列代码。成编译错误,例如下列代码。var a=(a=100);不能在一个语句中初始化多个隐式类型变量,系不能在一个语句中初始化多个隐式类型变量,系统会出现错误提示统会出现错误提示“隐式类型的局部变量不能有隐式类型的局部变量不能有多个声明符多个声明符”,例如下列代码。,例如下列代码。var a
5、=100,b=200;如果范围中有一个名为如果范围中有一个名为var的类型,则的类型,则var将解析将解析为该类型名称,而不是作为隐式类型局部变量的为该类型名称,而不是作为隐式类型局部变量的一部分,例如下列代码。一部分,例如下列代码。Int var=100;13.1.2 隐式类型的数组隐式类型数组的原理与隐式类型局部隐式类型数组的原理与隐式类型局部变量的原理相同,也是通过从数组的变量的原理相同,也是通过从数组的初始值中推断数组类型,例如下列代初始值中推断数组类型,例如下列代码。码。var a=new 1,2,3;var y=new Hello,null,world;编译器会推断出编译器会推断出
6、a和和y的数据类型,的数据类型,a是是int型数组,型数组,b是是string型数组。型数组。13.1.2 隐式类型的数组 注意:注意:隐式类型是不需要加隐式类型是不需要加“”的,即不需要的,即不需要var a=new1,2,3。对于交错数组,就如同使用一维数组那样使对于交错数组,就如同使用一维数组那样使用用new初始化。初始化。隐式类型的数组不支持多维数组。隐式类型的数组不支持多维数组。13.2 对象和集合初始值设定项 在在C#中,使用对象初始值设定项,可以在创建对象时向中,使用对象初始值设定项,可以在创建对象时向对象的任何可访问字段或属性分配值,而无需显式调用构对象的任何可访问字段或属性分
7、配值,而无需显式调用构造函数,例如可以定义一个造函数,例如可以定义一个Person类。类。class Person public string LastNameset;get;public string FristName set;get;public int Age set;get;可以使用它的公共字段或属性初始化一个可以使用它的公共字段或属性初始化一个person类的对类的对象象Doctor,代码如下。,代码如下。Person doctor=new Person()FristName=Jack,Lastname=lee,Age=49;当然也可以不提供全面的字段和属性初始化一个对象,代当然也
8、可以不提供全面的字段和属性初始化一个对象,代码如下。码如下。Person doctor=new Person()FristName=Jack,Lastname=lee;13.2 对象和集合初始值设定项 下列代码采用了自动实现的属性。下列代码采用了自动实现的属性。class Person1 private string name;public string Name get return name;set name=value;可简化成:可简化成:public string Nameget;set;13.2 对象和集合初始值设定项使用集合初始值设定项,可以在初始化一个实使用集合初始值设定项,可以
9、在初始化一个实现了现了IEnumerable的集合类时指定一个或多个的集合类时指定一个或多个元素初始值设定项。元素初始值设定项。示例:示例:List li=new List 0,1,2,3,4,5,6,7,8,9;List li1=new List 1,2,4/5,7*2/5;List p=new List new Person()LastName=Smith,FirstName=Tom,Age=8,new Person()LastName=Bush,FirstName=Mary,Age=2,;13.3 匿名类型 匿名类型提供了一种便捷的方法,能够将匿名类型提供了一种便捷的方法,能够将一组只读
10、属性封装到单个对象中,而无需一组只读属性封装到单个对象中,而无需首先显式定义一个类型。其实质就是该对首先显式定义一个类型。其实质就是该对象的类型名由编译器生成,并且不在代码象的类型名由编译器生成,并且不在代码中使用。中使用。示例:示例:var doctor=new FristName=Jack,Lastname=lee,Age=48;13.3 匿名类型 匿名类型的优势在于,可以将一组只读属匿名类型的优势在于,可以将一组只读属性封装在单个对象中,而不需要首先定义性封装在单个对象中,而不需要首先定义类。其中,类的名称将由编译器内部生成,类。其中,类的名称将由编译器内部生成,类在源代码中既不会显示,
11、也不能使用。类在源代码中既不会显示,也不能使用。匿名类型是由一个或者多个公共属性组成匿名类型是由一个或者多个公共属性组成的类,它不可以包含任何其他类成员,例的类,它不可以包含任何其他类成员,例如方法、事件等。最常见的操作是使用其如方法、事件等。最常见的操作是使用其他类型的一些属性初始化匿名类型。他类型的一些属性初始化匿名类型。13.4 扩展方法 C#中引入了扩展方法,它允许在不了解中引入了扩展方法,它允许在不了解现有的类源代码的情况下,向其中添加方现有的类源代码的情况下,向其中添加方法。法。步骤:步骤:必须添加一个静态类,用来包含要添加的扩必须添加一个静态类,用来包含要添加的扩展方法。展方法。
12、要添加的扩展方法必须为静态方法。要添加的扩展方法必须为静态方法。方法参数列表中第一个参数必须以方法参数列表中第一个参数必须以this开始,开始,然后是要扩展的类型名称和参数名。然后是要扩展的类型名称和参数名。13.4 扩展方法 示例:示例:static class PersonExtension public static void Speak(this Person person,string words)Console.WriteLine(words);13.5 Lambda表达式C#3.0为匿名方法提供了一个新的语法,即为匿名方法提供了一个新的语法,即Lambda表达式,又称为表达式,又
13、称为表达式,它可以表达式,它可以包含表达式和语句,并且可用于创建委托包含表达式和语句,并且可用于创建委托或或LINQ表达式。表达式。通过在表达式运算符通过在表达式运算符“=”(读作(读作goes to)左边输入参数(如果存在参数),表达式左边输入参数(如果存在参数),表达式运算符右边输入表达式或者语句块,可以运算符右边输入表达式或者语句块,可以快速而又简洁地构建匿名方法。快速而又简洁地构建匿名方法。Lambda表表达式主要应用于委托和达式主要应用于委托和LINQ。13.5 Lambda表达式示例:示例:下列代码是一个下列代码是一个Lambda表达式应用于委托表达式应用于委托的简单示例。的简单示
14、例。delegate int del(int i);del myDelegate=x=x*x;int j=myDelegate(5);13.6 小结本章主要介绍了本章主要介绍了C#中新增加的功能。这些功能极中新增加的功能。这些功能极大地丰富了大地丰富了C#语言特性,使其更加智能化,可以语言特性,使其更加智能化,可以减轻开发人员的编码负担,使开发人员能够更加减轻开发人员的编码负担,使开发人员能够更加灵活地编写程序。灵活地编写程序。这些新功能的核心还是这些新功能的核心还是LINQ,无论是隐式类型还,无论是隐式类型还是匿名类型,它们的出现都是为是匿名类型,它们的出现都是为LINQ做好铺垫,做好铺垫,以提高以提高LINQ查询的方便、快捷等优势。在使用这查询的方便、快捷等优势。在使用这些新功能时尤其需要注意,特别是隐式类型和匿些新功能时尤其需要注意,特别是隐式类型和匿名类型,它们在为开发人员的编码提供帮助的同名类型,它们在为开发人员的编码提供帮助的同时,也增加了阅读和维护源代码的难度。所以,时,也增加了阅读和维护源代码的难度。所以,建议在编写程序时应尽量选择严谨的类型,有利建议在编写程序时应尽量选择严谨的类型,有利于节省系统开销,便于系统维护。同时,选择严于节省系统开销,便于系统维护。同时,选择严谨的数据类型是一种良好的编程风格。谨的数据类型是一种良好的编程风格。