|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 在客岁PDC2005上,在公布C#2.0(C#Whidbey)的同时,微软也同时展现了它们在C#3.0上的一些企图。在提到一系列新的言语特征如言语集成查询(LINQ)等,Redmond同时也先容了一个新的特征--匿名范例。本文具体先容了匿名范例。
匿名范例界说
C#3.0标准将匿名范例形貌为从工具初始化器(objectinitializer)主动揣度和天生的元组范例。在你可以充实了解这必定义之前,你必要懂得"工具初始化器"的观点,它是匿名范例特征的基本。
工具初始化器给一个工具的一个大概多个域大概属性指定值。这就意味着你能够经由过程一系列诸如{a=10,b=20}如许的赋值操纵指定某个工具的一系列属性。换句话来讲,一个匿名范例是本来不存在的,而且没有在代码中明白指定的。
注重,编译器是在编译时创立匿名范例而非运转时。
你能够经由过程ILDASM(IL分化器)来分化取得:
varp1=new{Name="A",Price=3};
在编译时候,编译器利用工具初始化器揣度的属性来传见一个新的匿名范例。因此,新范例将会具有Name和Price的属性。Get和Set办法和保留这些属性的响应的公有变量,会主动的天生。在运转时,此范例的一个实例会被创立,这个实例的属性将会被设置为工具初始化器中指定的值。
C#外部
你大概很惊异的发明,你能够只界说一些属性的称号和它们的值,C#3.0会主动的从它们那边创立类。这是怎样做到的呢?反省一下编译器的处置吧。
如许入手下手一行代码:
varp1=new{Name="A",Price=3};
当C#3.0编译器碰到如许的一个哀求的时分,它将在背景将其转化成加倍分明的表达,以下:
class__Anonymous1
{
privatestringname;
privateintprice;
publicstringName{get{returnname;}set{name=value;}}
publicintPrice{get{returnprice;}set{price=value;}}
}
__Anonymous1p1=new__Anonymous1();
p1.Name="A";
pt.Price=3
实例进修
你必要安装VisualStudio2005和.NET2.0,然后你能够从这里下载到LINQ手艺的预览版本。
假如你安装了VisualStudio2005,你能够看到在VisualC#下多了3个和LINQ预览有关的工程模板:LINQConsoleApplication,LINQWindowsApplication,和LINQLibrary。
你能够如许创立一个利用匿名范例的工程:
1.翻开VisualStudio2005编纂器,创立一个新工程,选择LINQConsole作为工程模板;
2.将新工程定名为AnonTypes而且点击OK;
3.在编纂器里输出以下代码:
//Program.cs
usingSystem;
usingSystem.Query;
usingSystem.Data.DLinq;
namespaceAnonTypes
{
classProgram
{
staticvoidMain(string[]args)
{
varp1=new{Name="A",Price=3};
Console.WriteLine("Name={0}
Price={1}",p1.Name,p1.Price);
Console.ReadLine();
}
}
}
4.编译程序
5.实行程序,取得以下了局:
Name=A
Price=3
假如你没有VisualStudio2005,你仍旧能够经由过程命令行来编译你的代码:
C:ProgramFilesLINQPreviewBinCsc.exe
/reference:"C:ProgramFilesLINQPreviewBinSystem.Data.DLinq.dll"
/reference:System.dll
/reference:"C:ProgramFilesLINQPreviewBinSystem.Query.dll"
/out:AnonTypes.exe/target:exeProgram.cs
只管你没有明晰的在代码里界说一个类,可是C#编译器主动做了以下事情:
1.剖析范例
2.创立一个新的类(具有name和price属性)
3.利用这个类来初始化一个新工具
4.将传来的参数指定给工具
<P> 深切剖析代码
为了懂得编译器怎样创立一个新类的,翻开ILDASM(在C:ProgramFilesMicrosoftVisualStudio8SDKv2.0Bin下)而且选择比来的编译程序集,AnonTypes.exe。翻开树状视图,你能够看到如所示的视图:
假如你细心看,ILDASM展现了一个匿名范例"<Projection>f__0"是怎样被创立的。和类同时被创立的是公有变量_Name和_Price。对这两个变量的Get和Set办法也同时被创立,他们也具有属性Name和Price。
双击任何办法大概变量来看的分明一些,如你点击Name属性,你将会看到以下代码:
.propertyinstancestringName()
{
.getinstancestringAnonTypes.Program/
<Projection>f__0::get_Name()
.setinstancevoidAnonTypes.Program/
<Projection>f__0::set_Name(string)
}//endofproperty<Projection>f__0::Name
多个匿名范例
假如你创立了多个类似的匿名范例,C#编译器会伶俐的发明这一点,只天生一个类和它的两个实例,好比你输出以下代码:
usingSystem;
usingSystem.Query;
usingSystem.Data.DLinq;
namespaceAnonTypes
{
classProgram
{
staticvoidMain(string[]args)
{
varp1=new{Name="A",Price=3};
varp2=new{Name="A",Price=3};
Console.WriteLine("Name={0}
Price={1}",p1.Name,p1.Price);
Console.ReadLine();
}
}
}
当你编译完并用ILDASM翻开的时分,布局以下所示:
你能够看到,由于声明是相似的,以是C#只创立了一个匿名类,因此优化了程序。可是假如它们不是很相似的话,就会有两个匿名类。
略微修正以上代码,以下:
new{Name="A",Price=3};
varp2=new{Name="A"};
你能够看到,C#创立了两个类,<Projection>f__0and<Projection>f__1。
总结
这里我们能够看到,匿名范例为程序员供应了一种机制,该机制使得你不必明晰的声明类布局。并且,C#3.0编译器十分的智能化,在你具有多个类似的匿名范例时只创立一个匿名范例从而到达了优化程序的目标。c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。 |
|