《圣殿祭司的ASP.NET4.0专家技术手册》----2-10 匿名类型

2-10 匿名类型

圣殿祭司的ASP.NET4.0专家技术手册
C# 2.0有匿名方法(Anonymous Method),而C# 3.0又新增了“匿名类型(Anonymous Types)”,它的目的是“提供一个简单的途径将一组只读的属性封装在一个对象之中”,且在第一时间不必声明其明确类型。

2-10-1 匿名类型的由来

以下是一段匿名类型的变量声明,并以new的关键字进行初始化:

为什么要叫“匿名类型”?原因有几个:

(1)传统多半是先建立一个具名(Named)的类,然后再实体化一个类对象,因此,这个类一开始就有明确的名称定义;而“匿名类型”对象,从头到尾根本未指定过任何的名称,故称“匿名”。

(2)因为以匿名类型方式声明的对象,无法事先确定类型,必须等到编译器编译后,类型才是确定的,所以对程序员而言,类型是隐匿的。

(3)即使类型在编译后确定下来,也只有编译器及系统本身内部知道,就连在Visual Studio的Debug模式中,也一样无法得知确切类型,故执行或Debug除错时,对程序员还是隐匿的。

(4)对于以匿名类型方式声明的对象,关于类型及名称的部分,类型是由编译程序自行推论而决定,名称也是当下命名的,故一如先前所讲“道本无名,强名曰道。”原本这对象是没有具体的名称和类型,遇见了编译器这个“识人之士”,才给定“Anonymous Type”的名称和类型。

(5)在原本的.NET Framework之中,一个对象或变量就是单一类型,但匿名类型的变量,里面可能同时包含了string及int类型的属性,请问该叫它string类型,还是int类型?由于没有直接对应的类型,再加上它是多个类型的混合体,无法归属任何一个类型,最好的方式就是自成一格,就叫做“匿名类型”。

所以由上可知,匿名类型对象在主客观情形下,都是一再地“隐姓埋名”,一再地藏匿其明确类型,故称为匿名类型恰如其分,如图2-8所示。

“匿名类型”一词虽然有隐匿名称与类型的特性,但可别真以为它是没有类型的!一如老板常挂在嘴边的话:“我本身是开明的、我本身是没有默认立场的。”看到这里大家心里都会偷笑,做员工的只能口头上连连称是,但没人会信以为真,因为多半项目或决策最终仍是由老板的偏好与立场所左右,要真的弄不清老板的喜好,那可真完了。所以有些事情只是表面上形势不强,但骨子里却是出奇的强,故别被“匿名类型”表面字义的错觉给误导了,以为它是没类型或类型不明确的,以下是匿名类型的特性说明:

类型确定:所以别误以为匿名类型没有类型,它有明确的类型,事前虽不知类型,但编译后类型就确定了。
属性只读:匿名类型对象内的属性是只读的,不可更改,否则在编译时就会产生错误。
使用new关键字:匿名类型对象的初始化是使用new关键字。
类类型:匿名类型对象是属于Class类型,并且其类型是由其内部多个不同属性类型所组成。
类限制:匿名类型对象虽属于Class类型,但是其中不可以声明方法或事件等类成员,唯一接受的是属性。
反射类型:匿名类型虽然具有某种程度的隐密性,不让程序员可以直接观察到,但还是可通过Reflection去探索该对象的正确类型。
搭配var:匿名类型对象最常搭配var隐含类型声明,因为二者在声明上,都是对类型不需明确声明的。
搭配LINQ:匿名类型常搭配LINQ的select子句来进行查询。
类型归类:如果有多个匿名类型,其中所声明的属性、数量及顺序都一样的话,则编译器编译程序会自动视它们为相同的类型。
范例2-7 匿名类型对象的建立及使用
匿名类型初始化的对象,常以var声明其类型,两者常进行搭配运用,请参考AnonymousType. aspx程序:

238    protected void Page_Load(object sender, EventArgs e)
239    {
240        //声明一个匿名型对象
241        var person = new { Name = "圣殿祭司", City = "Taipei", Height = 180,
      Weight = 75 };
242        //person.Name = "奚江华";  //不合法,匿名类型是Read-Only,不可修改
243        //使用person匿名类型对象
244        string txtMsg = string.Format("姓名:{0},住在:{1},身高:{2},体重:{3}",
           person.Name, person.City, person.Height, person.Weight);
245        Response.Write(txtMsg);
246    }

程序说明
由于匿名类型是“提供一个简单的途径将一组只读的属性封装在一个对象之中”,因此属性是只读的。

范例2-8 探索匿名类型对象的类型与名称
既然作者口口声声说匿名类型对象类型是明确的,且编译器在编译时会替对象命名,并决定其类型,那可否进一步说明,如何真实见到其类型呢?请参考AnonymousTypeName.aspx程序:

247    protected void Page_Load(object sender, EventArgs e)
248    {
249        //实例化一个Customer类型对象
250        Customer Mary = new Customer();
251
252        Type t1 = Mary.GetType();
253        Response.Write("Mary的类型是:" + t1. UnderlyingSystemType +
            ",FullName是:" + t1.FullName+ ",Name是:" + t1.Name + "<BR/><BR/>");
254
255        //声明一个匿名型对象
256        var person = new { Name = "圣殿祭司", City = "Taipei", Height = 180, Weight
             = 75 };
257
258        Type t2 = person.GetType();
259        Response.Write("person的类型是:<Font Color='Blue'>" + t2.
           UnderlyingSystemType + "</Font><BR/>");
260        Response.Write("person的FullName是:<Font Color='Blue'>" + t2.FullName +
           "</Font><BR/>");
261        Response.Write("person的Name是:<Font Color='Blue'>" + t2.Name +
           "</Font><BR/>");
262    }

程序说明
为了让匿名类型有个对照,在此建立了Customer类的实体,并显示其类型与名称。

Type t2 = person.GetType()程序则是.NET Reflection技巧,可用来探索对象的属性与方法。

程序运行结果如图2-9所示。

2-10-3 匿名类型在隐含类型数组上的运用

前面在介绍隐含类型数组声明时,数组中的成员多半是int或者是string类型,但其实也可将匿名类型对象当成数组成员,然后加入隐含类型数组中。

范例2-9 匿名类型结合隐含类型数组——以模特经济公司为例
假设有一模特经济公司,要建立模特的基本数据供查询使用,在此以匿名类型建立模特个人资料,并加入隐含类型数组中,最后以LINQ做筛选查询,请参考AnonymousType Array .aspx程序:

程序说明

当然这只是数据建立与查询示范,实际模特基本数据的建立与保存,仍然是以SQL Server数据库为对象最佳。

程序运行结果如图2-10所示。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-10-03 22:55:29

《圣殿祭司的ASP.NET4.0专家技术手册》----2-10 匿名类型的相关文章

《圣殿祭司的ASP.NET4.0专家技术手册》---- 2-7 隐含类型局部变量及数组声明

2-7 隐含类型局部变量及数组声明 圣殿祭司的ASP.NET4.0专家技术手册以var声明的类型,叫做"隐含类型声明",像传统JavaScrip一样以var声明变量或对象. 2-7-1 初探var隐含类型声明 以下用var隐含类型声明数值及字符串的方式: var age=30 ; //声明年龄为30,为number数值型态 var name="Kevin"; //声明名字为Kevin,为string字符串型态 var隐含类型声明创造的最大目的是,为了配合LINQ查询

《圣殿祭司的ASP.NET4.0专家技术手册》----1-1 ASP.NET平台的三分天下

1-1 ASP.NET平台的三分天下 圣殿祭司的ASP.NET4.0专家技术手册 如果访问微软www.asp.net网站,会发现ASP.NET技术目前有3位成员:Web Form.MVC和Web Pages,如图1-1所示.它们各有不同的定位与特色,彼此的开发方式也不相同.目前,使用人数与市场占有率最高的仍是Web Form,而MVC近两年有不少技术玩家和项目采用,至于Web Pages,则是另外的Web Matrix开发工具预定的网页开发技术,它走更易于使用的开发路线. 你心里可能有疑问:"为

《圣殿祭司的ASP.NET4.0专家技术手册》---- 1-6 VS 2010 SP1安装与三个扩展管理工具

1-6 VS 2010 SP1安装与三个扩展管理工具 圣殿祭司的ASP.NET4.0专家技术手册 2011年3月,微软推出VS 2010 SP1软件补丁,里面包含许多新功能与问题修正,其中与Web开发相关新功能有: IIS 7.5 Express精简版网页服务器的支持(IIS 7.5 Express需额外下载安装): SQL Server CE 4.0的支持(SQL Server CE 4.0需额外下载安装): Razor语法支持: 可部署的依赖性支持(Deployable dependenci

《圣殿祭司的ASP.NET4.0专家技术手册》----1-2 .NET 4.0平台新功能概览

1-2 .NET 4.0平台新功能概览 圣殿祭司的ASP.NET4.0专家技术手册 .NET平台版本从1.0.1.1.2.0.3.0.3.5不断演进.最新4.0版的重要改进如下: NET Framework 4.0 Visual C# 2010 Visual Basic 2010 Visual F# 2010(或F# 2.0) 新的CLR 4.0运行时 DLR动态语言运行时(Dynamic Language Runtime) ASP.NET 4.0 ASP.NET MVC 2.0(最新版为4.0

《圣殿祭司的ASP.NET4.0专家技术手册》----2-4 DLR动态执行环境

2-4 DLR动态执行环境 圣殿祭司的ASP.NET4.0专家技术手册 在.NET 4.0平台下有3个重要动态角色:①dynamic动态类型.②IronPython与IronRuby动态语言.③DLR(Dynamic Language Runtime)动态执行环境,前两者之所以能够存在,在于DLR的创建,DLR克服了原本.NET平台无法支持动态语言的限制,在DLR基础架构的支持下,便能衍生出动态类型.动态语言的诸多应用,如图2-2所示. 微软列举DLR的好处有: 简化将动态语言移植到.NET F

《圣殿祭司的ASP.NET4.0专家技术手册》----1-3 ASP.NET 4.0技术概览

1-3 ASP.NET 4.0技术概览 圣殿祭司的ASP.NET4.0专家技术手册 1-3 ASP.NET 4.0技术概览ASP.NET 4.0技术概览 ASP.NET 4.0是在ASP.NET 2.0及3.5基础上,添加了一些新技术,一方面保持适当幅度创新,另一方面也保持对旧版本的兼容与延续性.例如,图表控件的内建.Silverlight 5.ASP.NET AJAX 4.0.jQuery.C# 4.0.VB 10.F#.IronPython.IronRuby.LINQ.Entity Fram

《圣殿祭司的ASP.NET4.0专家技术手册》----2-3 C# 4.0静态基础融入动态能力

2-3 C# 4.0静态基础融入动态能力 圣殿祭司的ASP.NET4.0专家技术手册 在了解静态与动态语言后,大家直觉上可能会以为这是二元的对立,非黑即白,不是静态语言,就是动态语言.但您是否想过静态和动态之间是可以兼具或混合的可能性?例如,静态语言为获取动态语言优点,而融入了一些动态语言的功能,然后又保持静态语言的优势,如类型安全.优化.高效率. 是的,.NET 4.0正是以这个方向去改造,在原本C#.VB静态语言基础上,加上动态语言的一些特性与优势,这样就达到以静态为主,动态为辅之目的,让C

《圣殿祭司的ASP.NET4.0专家技术手册》----1-8 .NET 4.0内建的图表控件

1-8 .NET 4.0内建的图表控件 圣殿祭司的ASP.NET4.0专家技术手册 以往ASP.NET 3.5要使用图表控件,必须再另外下载安装,但到了.NET 4.0,图表控件已变成内建,在ASP.NET 4.0项目中就可以直接使用,如图1-17所示,省去了很多麻烦. .NET 4.0图表控件联机帮助文件: http://msdn.microsoft.com/zh-tw/library/dd456632.aspx .NET 3.5图表控件范例程序: http://goo.gl/Pz4I1 .N

《圣殿祭司的ASP.NET4.0专家技术手册》----2-1 C# 4.0语言新功能

2-1 C# 4.0语言新功能 圣殿祭司的ASP.NET4.0专家技术手册 C# 4.0新增的语言功能,除了命名实参和可选实参(VB早已支持)较为常用,其他功能几乎是从动态基础衍生出来的便利性或灵活性,新功能如下: 命名实参和可选实参(Named and Optional Arguments): Dynamic动态类型(Dynamic Type): 共变量与反变量(Covariance and Contravariance): Office可程序性支持(Office Programmabilit