分享
 
 
 

C# 3.0中新匿名类型特性初体验

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

在去年PDC2005上,在发布C#2.0 (C# Whidbey)的同时,微软也同时展示了它们在C# 3.0上的一些计划。在提到一系列新的语言特性如语言集成查询(LINQ)等,Redmond同时也介绍了一个新的特性--匿名类型。本文详细介绍了匿名类型。

匿名类型定义

C#3.0规范将匿名类型描述为从对象初始化器(object initializer)自动推断和生成的元组类型。在你能够充分领会这一定义之前,你需要了解"对象初始化器"的概念,它是匿名类型特性的基础。

对象初始化器给一个对象的一个或者多个域或者属性指定值。这就意味着你可以通过一系列诸如{a=10,b=20}这样的赋值操作指定某个对象的一系列属性。换句话来说,一个匿名类型是原来不存在的,并且没有在代码中明确指定的。

注意,编译器是在编译时创建匿名类型而非运行时。

你可以通过ILDASM(IL分解器)来分解获得:

var p1 = new {Name = "A", Price = 3};

在编译时刻,编译器使用对象初始化器推断的属性来传见一个新的匿名类型。因而,新类型将会拥有Name和Price的属性。Get和Set方法和保存这些属性的相应的私有变量,会自动的生成。在运行时,此类型的一个实例会被创建,这个实例的属性将会被设置为对象初始化器中指定的值。

C#内部

你可能很惊奇的发现,你可以只定义一些属性的名称以及它们的值,C# 3.0会自动的从它们那里创建类。这是怎么做到的呢?检查一下编译器的处理吧。

这样开始一行代码:

var p1 = new {Name = "A", Price = 3};

当C# 3.0编译器遇到这样的一个请求的时候,它将在后台将其转化成更加清楚的表达,如下:

class __Anonymous1

{

private string name ;

private int price;

public string Name{ get { return name; } set { name = value ; } }

public int Price{ get { return price; } set { price= value ; } }

}

__Anonymous1 p1 = new __Anonymous1();

p1.Name = "A";

pt.Price =3

实例学习

你需要安装Visual Studio 2005和.NET 2.0,然后你可以从这里下载到LINQ技术的预览版本。

如果你安装了Visual Studio 2005,你可以看到在Visual C#下多了3个和LINQ预览有关的工程模板:LINQ Console Application, LINQ Windows Application, 和LINQ Library。

你可以这样创建一个使用匿名类型的工程:

1. 打开Visual Studio 2005编辑器,创建一个新工程,选择LINQ Console作为工程模板;

2. 将新工程命名为AnonTypes并且点击OK;

3. 在编辑器里输入如下代码:

// Program.cs

using System;

using System.Query;

using System.Data.DLinq;

namespace AnonTypes

{

class Program

{

static void Main(string[] args)

{

var p1 = new {Name = "A", Price = 3};

Console.WriteLine("Name = {0}\nPrice = {1}",p1.Name, p1.Price);

Console.ReadLine();

}

}

}

4. 编译程序

5. 执行程序,获得如下结果:

Name = A

Price = 3

如果你没有Visual Studio 2005,你仍然可以通过命令行来编译你的代码:

C:\Program Files\LINQ Preview\Bin\Csc.exe

/reference:"C:\Program Files\LINQ Preview\Bin\System.Data.DLinq.dll"

/reference: System.dll

/reference:"C:\Program Files\LINQ Preview\Bin\System.Query.dll"

/out:AnonTypes.exe /target:exe Program.cs

尽管你没有清晰的在代码里定义一个类,但是C#编译器自动做了如下工作:

1. 解析类型

2. 创建一个新的类(拥有name和price属性)

3. 使用这个类来初始化一个新对象

4. 将传来的参数指定给对象

深入解析代码

为了了解编译器如何创建一个新类的,打开ILDASM(在C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin下)并且选择最近的编译程序集,AnonTypes.exe。打开树状视图,你可以看到如图1所示的视图:

图1

如果你仔细看,ILDASM展示了一个匿名类型"<Projection>f__0"是如何被创建的。和类同时被创建的是私有变量_Name和_Price。对这两个变量的Get和Set方法也同时被创建,他们也拥有属性Name和Price。

双击任何方法或者变量来看的清楚一些,如你点击Name属性,你将会看到如下代码:

.property instance string Name()

{

.get instance string AnonTypes.Program/

'<Projection>f__0'::get_Name()

.set instance void AnonTypes.Program/

'<Projection>f__0'::set_Name(string)

} // end of property '<Projection>f__0'::Name

多个匿名类型

如果你创建了多个相似的匿名类型,C#编译器会聪明的发现这一点,只生成一个类和它的两个实例,比如你输入如下代码:

using System;

using System.Query;

using System.Data.DLinq;

namespace AnonTypes

{

class Program

{

static void Main(string[] args)

{

var p1 = new {Name = "A", Price = 3};

var p2 = new {Name = "A", Price = 3};

Console.WriteLine("Name = {0}\nPrice = {1}",p1.Name, p1.Price);

Console.ReadLine();

}

}

}

当你编译完并用ILDASM打开的时候,结构如下所示:

图2

你可以看到,因为声明是类似的,所以C#只创建了一个匿名类,因而优化了程序。但是如果它们不是很类似的话,就会有两个匿名类。

稍微修改以上代码,如下:

new {Name = "A", Price = 3};

var p2 = new {Name = "A"};

图3

你可以看到,C#创建了两个类,<Projection>f__0 and <Projection>f__1。

总结

这里我们可以看到,匿名类型为程序员提供了一种机制,该机制使得你无须清晰的声明类结构。而且,C# 3.0编译器非常的智能化,在你拥有多个相似的匿名类型时只创建一个匿名类型从而达到了优化程序的目的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有