| |
C# 3.0中新匿名类型特性初体验 |
|
时间: 2006-03-13 来自:天极开发 |
 |
|
深入解析代码
为了了解编译器如何创建一个新类的,打开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编译器非常的智能化,在你拥有多个相似的匿名类型时只创建一个匿名类型从而达到了优化程序的目的。
|
|
|
|
|
|
|
|