技术开发 频道

新Orcas语言特性:匿名类型

 

声明匿名类型

至此,我们介绍了var这个关键词,我们可以开始用它来指代匿名类型了。

C#中的匿名类型是使用与我语言系列第一个博客贴子里讨论过的对象初始化句法同样的句法来定义的。其区别是,不是作为初始化语法的一部分来声明类型名称,而是在实例化匿名类型时,你将new关键词后面的类型名称省略掉:

编译器会分析上面的句法,自动定义一个带有4个属性的新的标准CLR类型。这4个属性的类型是根据赋给的初始值的类型来决定的。例如,在上面的例子中,Id属性被赋值了一个整数,所以编译器将生成一个类型为整数的属性。

匿名类型的实际CLR名称是由C#编译器自动生成的。CLR本身并不知道匿名类型和非匿名类型间的区别,所以两者的运行时语义是绝对完全一样的。Bart De Smet在这里写有一篇很好的博客贴子,对此做了详细讨论,如果你想知道匿名类型的确切类命名模式以及生成的IL的话。

注意上面,当你在匿名类型上键入"product." 时,你依然在Visual Studio中得到编译时检查和完整的intellisense。还注意一下,intellisense描述是如何表明它是个AnonymousType(匿名类型)的,但依然提供了完全的属性声明信息,如红线圈出的文字所示。

使用匿名类型做分层构形

匿名类型可以带来便利的一个强有力的场景是,可以用最小量的代码来轻易地对数据做分层构形投影。

例如,我可以编写下面这样的LINQ表达式,对Northwind数据库中价格大于50美元的所有产品进行查询,然后将返回的产品用以产品的ReorderLevel(库存重订购水平)来排序的一个分层结构来构形(使用了LINQ查询句法支持的group into子句):

将上面的代码在ASP.NET中运行时,我将得到浏览器显示的下列输出:

同样地,我也可以根据JOIN结果来做分层构形。例如,下面的代码生成了一个新匿名类型,它带有几个标准的产品字段属性,以及一个含有客户对特定产品所做的最新5个订单的分层的子集合属性:

     注意到我是如何利落地访问分层数据的。在上面,我对产品查询进行循环,然后细钻到每个产品的最新5个订单的。你可以看到,到处都有完整的intellisense和编译时检查,即使是匿名类型上订单细节的嵌套子集合中的对象的属性上也都有。

0
相关文章