VisualBasic9.0概述发布日期:11/10/2005|更新日期:11/10/2005ErikMeijer、AmandaSilver和PaulVickMicrosoft、Corporation摘要:本文概述支持数据密集型编程的新的VisualBasic语言特性和新的语言扩展。本页内容简介开始使用VisualBasic9.0隐式类型本地变量对象和集合初始值设置项匿名类型深层次的XML支持查询综合扩展方法嵌套函数空类型宽松的委托动态接口(或强“鸭子类型”)动态标识符小结简介“代号为Orcas的VisualBasic”(VisualBasic9.0)引入了一些语言扩展功能,以统一的方式支持数据密集型编程—创建、更新以及查询关系型数据库、XML文档和对象图形,这些语言扩展均基于“代号为Whidbey的VisualBasic”而构建。除此之外,VisualBasic9.0还引入一些新的语言特性,用于支持可能的静态输入和必要的动态输入,以增强VisualBasic的特有功能。这些新特性是:隐式类型本地变量查询综合对象初识值设定项匿名类型与Linq框架的完全集成深层次的XML支持宽松的委托空类型动态接口动态标识符©2010MicrosoftCorporation.Allrightsreserved.本文对这些新特性进行简要概述。要获得包括VisualBasic语言定义和编译器预览在内的更多信息,请访问VisualBasic开发人员中心([])。返回页首开始使用VisualBasic9.0为了领会这些语言特性在实际应用中的作用,我们举一个真实示例—CIAWorldFactbook数据库[]。该数据库包罗万象,涵盖了世界各国的地理、经济、社会和政治信息。就本文示例而言,我们采用一个包含各国国名、首都、总面积和人口的架构。在VisualBasic9.0中,我们以下面这个类来表示该架构:ClassCountryPublicPropertyNameAsStringPublicPropertyAreaAsFloatPublicPropertyPopulationAsIntegerEndClass以下是国家数据库的一个小子集,我们将以其作为运行示例:DimCountries=_{newCountry{_.Name=Palau,.Area=458,.Population=16952},_newCountry{_.Name=Monaco,.Area=1.9,.Population=31719},_newCountry{_.Name=Belize,.Area=22960,.Population=219296},_newCountry{_.Name=Madagascar,.Area=587040,.Population=13670507}_}给定该列表后,通过以下查询综合,我们就能够查询所有人口小于一百万的国家:DimSmallCountries=SelectCountry_FromCountryInCountries_WhereCountry.Population1000000ForEachCountryAsCountryInSmallCountriesConsole.WriteLine(Country.Name)Next因为只有马达加斯加岛(Madagascar)拥有超过一百万的居民,所以编译并运行以上程序时,将打印以下国家名称列表:PalauMonacoBelizeVisualBasic9.0提供的特性使编程完成这项查询相当简单,让我们通过研究该程序来理解这些特性。首先,Countries变量的声明DimCountries=_{newCounty{.Name=Palau,.Area=458,.Population=16952},_..._}使用了新的对象初始值设定项语法,即newCountry{...,.Area=458,...},该语法类似于现有的With语句,通过这种简洁的、基于表达式的语法可以创建复杂的对象实例。它还说明了隐式类型的本地变量的声明方法,即编译器从声明右侧的初始化表达式推断本地变量Countries的类型。以上声明完全等效于显式类型的Country()类型的本地变量声明。DimCountriesAsCountry()={...}需要强调的是,这仍然是强类型声明;编译器已经自动推断出本地声明右侧的类型,因此程序员无需手动将其输入到程序中。SmallCountries本地变量的声明通过类似于SQL风格的查询综合进行初始化,以筛选出居民总数不足一百万的所有国家。与SQL的异曲同工并非有意的,其目的是使已经了解SQL的程序员能够更迅速地了解VisualBasic的查询语法。DimSmallCountries=SelectCountry_FromCountryInCountries_WhereCountry.Population1000000请注意,我们还有另一个隐式输入的应用程序:编译器将SmallCountries的类型推断为IEnumerable(OfCountry)。编译器本身将查询综合翻译成标准的查询操作符。在这种情况下,翻译如以下语句一样简单:FunctionF(CountryAsCountry)AsBooleanReturnCountry.Population1000000EndFunctionDimSmallCountriesAsIEnumerable(OfCountry)=_Countries.Where(AddressOfF)扩展语法将编译器生成的本地函数作为委托AddressOfF传递到扩展函数Where中,在标准的查询操作符库中,该函数定义为IEnumerable(OfT)接口的扩展。既然我们已经了解了VisualBasic9中的一些新特性,那么就让我们进一步研究其中的细节吧。返回页首隐式类型本地变量在隐式类型的本地变量声明中,本地变量的类型从本地声明语句右侧的初识化表达式中推断。例如,编译器将推断以下所有变量声明的类型:DimPopulation=31719DimName=BelizeDimArea=1.9DimCountry=NewCountry{.Name=Palau,...}因此,这些声明完全等效于以下显式类型声明:DimPopulationAsInteger=31719DimNameAsString=BelizeDimAreaAsFloat=1.9DimCountryAsCountry=NewCountry{.Name=Palau,...}因为在默认情况下推断本地变量声明的类型,所以无论OptionStrict的设置为何,总是早期绑定对于这些变量的访问。在VisualBasic9.0中,程序员必须按以下方式将变量显式声明为类型Object,从而显式指定晚期绑定:DimCountryAsObject=newCountry{.Name=Palau,...}要求使用显式晚期绑定是为了防止意外使用晚期绑定,但更重要的是,这样做可以有力地扩展它对诸如XML等新数据类型的晚期绑定,这一点我们稍后讨论。有一个可选的项目级开关可以切换现有的行为。For...Next或ForEach...Next语句中的循环控制变量也可以是一个隐式类型变量。在ForDimI=0ToCount或ForEachDimCInSmallCountries中指定循环控制变量时,标识符将定义一个新的隐式类型本地变量,其类型从初始值设定项或集合表达式中推断,并作用于整个循环。在For右面使用Dim与隐式类型的循环控制变量一样,都是VisualBasic9.0引入的新特性。通过该类型引用应用程序,我们能够按以下方式重写打印所有小国的循环:ForEachDimCountryInSmallCountriesConsole.WriteLine(Country.Name)NextCountry的类型推断为SmallCountries的元素类型Country。返回页首对象和集合初始值设置项在VisualBasic中,With语句无需多次指定目标表达式,即可简化对一个聚合值的多个成员的访问。在With语句块内,对以句点(“.”)开头的成员访问表达式进行求值,就好像句点前面带有With语句的目标表达式一样。例如,以下语句初始化一个新的Country实例,随后又将该实例的字段初始化为所需的值:DimPalau=NewCountry()WithPalau.Name=Palau.Area=458.Population=16952EndWith新的VisualBasic9.0对象初始值设定项采用的是一种基于表达式的With格式,用于以简明的方式创建复杂的对象实例。通过对象初识值设定项,我们能够将以上两条语句捕获为一条(隐式类型的)本地声明,如下所示:DimPalau=NewCountry{_.Name=Palau,_.Area=458,_.Population=16952}这种在表达式中进行的对象初始化对于查询而言非常重要。一条查询语句通常就像由等号右侧的Select子句初始化的对象声明。由于Select子句返回一个表达式,因此我们必须能够以一条表达式初始化整个对象。我们已经看到,对象初始值设定项对于创建复杂对象的集合也是很方便的。任何支持Add方法的集合都能够通过一个集合初始值设定项表达式进行初始化。例如,给定城市声明作为部分类,PartialClassCityPublicPropertyNameAsStringPublicPropertyCountryAsStringPublicPropertyLongitudeAsFloatPublicPropertyLatitudeAsFloatEndClass我们能够按以下方式创建一个示例国家的首都城市列表:DimCapitals=NewList(OfCity){_{.Name=Antanarivo,_.Country=Madagascar,_.Longitude=47.4,_.Lattitude=-18.6},_{.Name=Belmopan,_.Country=Belize,_.Longitude=-88.5,_.Latitude=17.1},_{.Name=Monaco,_.Country=Monaco,_.Longtitude=7.2,_.Latitude=43.7},_{.Country=Palau,.Name=Koror,_.Longitude=135,_.Latitude=8}_}该示例还使用嵌套对象初始值设定项,嵌套初始值设定项的构造函数从上下文中推断。在这种情况下,每个嵌套初始值设定项完全等效于完整形式的NewCity{...}。返回页首匿名类型通常,我们希望在查询结果中移除或抛出一类特定成员。例如,我们也许只想知道所有热带首都城市的Name和Country,虽然也使用源数据中的Latitude和Longitude列标识热带,但是在结果中抛出了这两列。在VisualBasic9.0中要实现这个功能,我们可以为每个纬度位于巨蟹座热带和摩羯座热带之间的城市C创建一个新的对象实例,而不用命名类型:ConstTropicOfCancer=23.5ConstTropicOfCapricorn=-23.5DimTropical=SelectNew{.Name=City.Name,.Country=City.Country}_FromCityInCapitals_WhereTropicOfCancer=City.Latitude_AndAlsoCity.Latitude=TropicOfCapricorn本地变量Tropical的推断