1、与之前的版本相比,VB.NET 2008引入了新的语言功能,其中包括局部类型推理、对象初始值设定项、匿名类型和扩展方法。这些功能是对一项很重要的新功能语言集成查询(LINQ)的支持,但是它们单独使用时也很有用,本章将介绍这些新增功能的应用。10.1 局部类型推理10.2 匿名类型10.3 对象初始值设定项10.4 扩展方法10.5 Lambda表达式10.6 语言集成查询局部类型推理允许声明变量时不使用As子句显式声明类型,而是由编译器通过初始化表达式的类型来推断出变量的类型。1 Public Sub inferenceExample()2 Dim num1 As Integer=3 使用显式
2、类型声明 3 Dim num2=3 使用局部类型推理 4 End Sub当局部变量未使用As子句进行声明,并且被赋值时,会发生类型推理。编译器将值的类型用作变量的类型。例如,下面的几行代码各自声明一个String类型的变量。1 Dim name1 As String=Springfield 使用显式类型声明 2 Dim name2=Springfield 使用局部类型推理需要注意的是,局部类型推理不能用于声明类字段,也不能用于声明静态变量。使用类型推理的代码类似于依赖后期绑定的代码。但是,类型推理可将变量设置为强类型,而不是使变量保留为Object。编译器使用变量的初始值设定项,在编译时确定变
3、量的类型,以生成早期绑定代码。使用匿名类型功能可以不必先编写类定义,即创建新数据类型的实例。编译器会根据声明该实例时所指定的属性来创建数据类型定义。该类没有可用的名称,而是直接从Object继承的,它包含在声明对象时指定的属性。由于未指定数据类型的名称,因此将它称为匿名类型。下面的示例使用对象初始值设定项声明并创建变量anonymousproduct,作为具有两个属性(Name和Price)的匿名类型的实例。Dim anonymousProduct=New With .Name=paperclips,.Price=1.29请注意,声明匿名类型的实例与使用对象初始值设定项声明命名类型的实例相似。
4、下面的代码声明了Product类的一个实例namedProduct。Dim namedProduct=New Product With.Name=paperclips,.Price=1.29如果要创建临时对象来包含相关数据,也不需要完整类可能包含的其他字段和方法,匿名类型就是很好的解决方案。如果每个声明都需要不同的属性选择或者要更改属性顺序,则适于使用匿名类型。但是,如果项目以固定顺序包括多个具有相同属性的对象,则使用具有类构造函数的命名类型来声明可能更为方便。利用对象初始值设定项,可以使用单个表达式来指定复杂对象的属性。对象初始值设定项可用于创建命名类型和匿名类型的实例。对于命名类型来说,对
5、象初始值设定项提供了一种简单的方式,可以在单个语句中调用类型的构造函数并设置某些属性或所有属性的值。编译器为该语句调用适当的构造函数:如果未提供任何参数,则调用默认构造函数;如果传递了一个或多个参数,则调用参数化构造函数。在此之后,指定的属性会按照其在初始值设定项列表中出现的顺序进行初始化。例如,在下面的代码中,Customer类必须存在,且必须具有可以接受字符串值的名为Name和City的成员。1 Dim cust0 As Customer=New Customer With.Name=Toni Poe,_ 2 .City=Louisville如果Customer类包含参数化构造函数,则还可
6、以通过下面的方式声明和初始化Customer对象。1 Dim cust3 As Customer=New Customer(Toni Poe)_ 2 With.City=Louisville 3 4 Dim cust4 As New Customer(Toni Poe)_ 5 With.City=Louisville此外,通过将对象初始值设定项与局部类型推理结合使用,可以减少用于声明cust1的代码,这样可以在变量声明中省略As子句。变量的数据类型将从通过赋值创建的对象的类型推断得到。在下面的示例中,cust6的类型为Customer。Dim cust6=New Customer With.N
7、ame=Toni Poe,.City=Louisville匿名类型使用对象初始值设定项来创建未显式定义和命名的新类型的实例,编译器会根据在对象初始值设定项列表中指定的属性生成类型。下面的代码使用对象初始值设定项声明了一个匿名类型的实例。Dim anonymousCust=New With.Name=Hugo Garcia二者唯一的语法区别在于,没有在New之后为数据类型指定名称。但是,结果却截然不同。编译器会定义一个具有两个属性(Name和City)的新匿名类型,并使用指定的值创建该类型的实例。类型推理机制会将该示例中的Name的类型确定为字符串。使用扩展方法可以从某个数据类型外部向该类型添加
8、方法,这些方法就称为扩展方法,可以像该数据类型的普通实例方法那样进行调用。扩展方法只能是Sub过程或Function过程,必须使用System.Runtime.CompilerServices命名空间中的扩展属性进行标记,并且只能在模块中声明。扩展方法定义中的第一个参数指定方法所扩展的数据类型。运行方法时,第一个参数被绑定到调用该方法的数据类型的实例。下面代码演示了如何定义String类型的Print扩展方法。1 Imports System.Runtime.CompilerServices2 3 Module StringExtensions4 5 _6 Public Sub Print(B
9、yVal aString As String)7 Console.WriteLine(aString)8 End Sub9 10 End Module下面代码演示了扩展方法的调用。1 Imports ConsoleApplication2.StringExtensions2 Module Module13 Sub Main()4 Dim example As String=Hello5 example.Print()调用String类型的扩展方法Print6 7 example.ToUpper()调用普通的实例方法8 example.ToUpper.Print()9 End Sub10 End
10、 Modulelambda表达式是一种无名函数,用于计算并返回单个值,可在委托类型有效的任何地方使用。下面代码就是一个lambda表达式的例子,该表达式递增其参数并返回值。Function(num As Integer)num+1 如果要多次使用函数,为了方便起见,可以将函数分配给一个变量名称。Dim add1=Function(num As Integer)num+1下面代码是对该函数的调用。Console.WriteLine(add1(5)结果为6还可以同时声明和运行函数 Console.WriteLine(Function(num As Integer)num+1)(5)lambda表达
11、式没有名称。Lambda表达式不能有修饰符,例如,Overloads或Overrides。Lambda表达式不使用As子句来指定函数的返回类型。相反,类型是从lambda 表达式主体计算得出的值推断而来的。例如,如果lambda表达式的主体为Where cust.City=London,则其返回类型为Boolean。函数体必须是表达式,不能是语句。函数体可以包含对Function函数过程的调用,但不能包含对Sub子过程的调用。不存在Return语句。函数返回的值是函数体中的表达式的值。不存在End Function语句。要么所有参数都必须具有指定的数据类型,要么必须推断所有类型。不允许使用Op
12、tional和Paramarray参数不允许使用泛型参数。可以看到Lambda表达式的语法限制很多,并且由于lambda表达式的使用方式,lambda表达式通常简短而不复杂。语言集成查询(LINQ)为Visual Basic添加了查询功能,并且提供了用于处理各种数据的简单而强大的功能。LINQ引入查询作为Visual Basic语言的一部分,而不是向数据库发送要进行处理的查询或者对要搜索的每种类型的数据使用不同的查询语法,它使用与数据类型无关的统一语法。下面的示例演示了一个LINQ查询,该查询从一个集合返回客户列表,并将这些客户按地点进行分组。1 Dim customers As List(O
13、f Customer)=GetCustomerList()2 3 Dim customersByCountry=From cust In customers _4 Order By cust.Country,cust.City _5 Group By CountryName=cust.Country _6 Into RegionalCustomers=Group,Count()_7 Order By CountryName8 9 For Each country In customersByCountry10 Console.WriteLine(country.CountryName&_11 (&country.Count&)&vbCrLf)12 13 For Each customer In country.RegionalCustomers14 Console.WriteLine(vbTab&customer.CompanyName&_15 (&customer.City&)16 Next17 Next
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。